题目大意:有一个n*m的矩阵表示field,'W'表示水域,'.'表示干地,现在求池塘pond的数量。
pond的数量=连通分支的个数。从一个未被访问的点'W'开始,经DFS后遍历了整个水域;再从下一个未被访问点'W'开始……即可求出连通分支个数。
忘记了是m列,将for(j=0;j<m;j++)写成了for(j=0;j<n;j++)。WA了N久,都没发现。
源代码:
2386 | Accepted | 412K | 0MS | C | 788B | 2013-10-14 21:46:13 |
#include "stdio.h" #include "string.h" #define MAX 100 int n,m,visit[MAX][MAX]; char field[MAX][MAX]; int adjacence[8][2]={{-1,1}, {0,1}, {1,1}, {1,0}, {1,-1}, {0,-1}, {-1,-1}, {-1,0}}; void dfs(int x,int y) { int i,newx,newy; visit[x][y]=1; for(i=0;i<8;i++) { newx=x+adjacence[i][0]; newy=y+adjacence[i][1]; if(newx>=0&&newx<n&&newy>=0&&newy<m&&!visit[newx][newy]&&field[newx][newy]=='W') dfs(newx,newy); } } int main() { int i,j,ponds=0; scanf("%d%d",&n,&m); memset(visit,0,sizeof(visit)); for(i=0;i<n;i++) scanf("%s",field[i]); for(i=0;i<n;i++) for(j=0;j<m;j++) if(field[i][j]=='W'&&!visit[i][j]) { dfs(i,j); ponds++; } printf("%d\n",ponds); return 0; }
买一送一,POJ 2386的翻版。
源代码:
1562 | Accepted | 180K | 0MS | C | 842B | 2013-10-14 22:09:14 |
#include "stdio.h" #include "string.h" #define MAX 100 int n,m,visit[MAX][MAX]; char field[MAX][MAX]; int adjacence[8][2]={{-1,1}, {0,1}, {1,1}, {1,0}, {1,-1}, {0,-1}, {-1,-1}, {-1,0}}; void dfs(int x,int y) { int i,newx,newy; visit[x][y]=1; for(i=0;i<8;i++) { newx=x+adjacence[i][0]; newy=y+adjacence[i][1]; if(newx>=0&&newx<n&&newy>=0&&newy<m&&!visit[newx][newy]&&field[newx][newy]=='@') dfs(newx,newy); } } int main() { int i,j,deposits; while(scanf("%d%d",&n,&m)&&n) { memset(visit,0,sizeof(visit)); deposits=0; for(i=0;i<n;i++) scanf("%s",field[i]); for(i=0;i<n;i++) for(j=0;j<m;j++) if(field[i][j]=='@'&&!visit[i][j]) { dfs(i,j); deposits++; } printf("%d\n",deposits); } return 0; }