[poj]P2386 寬搜模板-lake counting
阿新 • • 發佈:2019-02-11
試題描述 |
有一個大小為M*N的園子,雨後積起了水。八連通的積水被認為是連線在一起的。請求出園子裡共有多少水窪?(八連通指的是下面圖中相對W的*的部分) |
輸入 |
第一行包含兩個正整數 N 和 M,表示將一個園子地面分成N*M塊方格,N 行,M列,接下來的 N 行描述了園子地面狀況,其中‘W’表示積水的水窪,‘.’表示沒有積水。 |
輸出 |
僅一個數,表示水窪的總數。 |
輸入示例 |
10 12 w........ww. .www.....www ....ww...ww. .........ww. .........w.. ..w......w.. .w.w.....ww. w.w.w.....w. .w.w......w. ..w.......w. |
輸出示例 |
3 |
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> const int maxn=10005; using namespace std; int n,m; char a[maxn][maxn]; int ans=0; int tail,head; int h[maxn][maxn]; int dx[8]={1,-1,0,0,1,-1,1,-1}; int dy[8]={0,0,1,-1,1,-1,-1,1}; void bfs(int p,int q); int main() { cin>>n>>m; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>a[i][j]; } } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(a[i][j]=='w') bfs(i,j); } } cout<<ans<<endl; return 0; } void bfs(int p,int q) { int xx,yy; tail=1;head=0; ans++; h[1][1]=p; h[1][2]=q; a[p][q]='.'; do{ head++; for(int z=0;z<8;z++){ xx=h[head][1]+dx[z];//h[head]而非h[tail],將周圍8點與中間點聯絡 yy=h[head][2]+dy[z]; if(xx>0&&xx<=n&&yy>0&&yy<=m&&a[xx][yy]=='w'){ a[xx][yy]='.'; tail++; h[tail][1]=xx; h[tail][2]=yy; } } }while(head<=tail); }
寬搜模板,佇列的初步運用,使用佇列的頭尾指標的移動來達到深搜的遍歷效果