http://acm.hdu.edu.cn/showproblem.php?pid=1198 /*用DFS来做*/ #include<stdio.h> #include<string.h> int dir[4][2]={-1,0,0,1,1,0,0,-1};//向上,向右,向下,向左 bool pip[11][4]={{1,0,0,1},{1,1,0,0},{0,0,1,1},{0,1,1,0},{1,0,1,0},{0,1,0,1}, {1,1,0,1},{1,0,1,1},{0,1,1,1},{1,1,1,0},{1,1,1,1}};//管道通路示意图:上右下左,1代表通路,0代表不通 char map[50][50];//地图,用来存管道铺设 bool mark[50][50];//标记,用来存已遍历方块 int m,n,count;//用来存储需要水源的数量 void dfs(int i,int j) { int x,y,k; mark[i][j]=1; for(k=0;k<4;k++) { x=dir[k][0]+i; y=dir[k][1]+j; if(!mark[x][y]&&x>=0&&x<m&&y>=0&&y<n&&pip[map[i][j]-'A'][k]==1&&pip[map[x][y]-'A'][(k+2)%4]==1) dfs(x,y); } } void ergodic() { int i,j; for(i=0;i<m;i++) for(j=0;j<n;j++) { if(!mark[i][j]) { dfs(i,j); count++; } } return ; } int main() { int i; while(scanf("%d%d",&m,&n),n!=-1&&m!=-1) { memset(mark,0,sizeof(mark)); for(i=0;i<m;i++) scanf("%s",map[i]); count=0; ergodic(); printf("%d/n",count); } return 0; }