POJ_2386_Lake Counting

//简单的一道题,使用dfs和bfs都可以,当然使用bfs效率比较高,这里使用bfs实现 //与1562差别不大 #include<stdio.h> #include<queue> #include<string.h> using namespace std; char map[105][105]; bool vis[105][105];//保存访问过的节点 //八个方向 int di[8][2]={-1,0,-1,1,0,1,1,1,1,0,1,-1,0,-1,-1,-1}; int n,m,ans; int isin(int x,int y) { if(x>=0&&x<n&&y>=0&&y<m) return 1; return 0; } int bfs(int x,int y) { queue<int> q; q.push(x);q.push(y); vis[x][y]=ans; while(!q.empty()) { int a,b,i; a=q.front();q.pop(); b=q.front();q.pop(); for(i=0;i<8;i++) { int c=a+di[i][0],d=b+di[i][1]; if(isin(c,d)&&map[c][d]=='W'&&!vis[c][d]) { q.push(c);q.push(d); vis[c][d]=ans; } } } while(!q.empty()) q.pop(); return 0; } int main() { while(scanf("%d%d",&n,&m)==2) { int i,j; ans=1; for(i=0;i<n;i++) scanf("%s",map[i]); memset(vis,0,sizeof(vis)); for(i=0;i<n;i++) { for(j=0;j<m;j++) { if(map[i][j]=='W'&&!vis[i][j]) { bfs(i,j);ans++; } } } printf("%d/n",ans-1); } return 0; }

你可能感兴趣的:(POJ_2386_Lake Counting)