转载请注明出处:http://blog.csdn.net/a1dark
分析:蛋蛋疼、跟上一题一样、图的DFS遍历、不过这里需要预处理一下字符、然后再DFS、
#include<stdio.h> #include<string.h> #include<iostream> using namespace std; char mp[55][55]; int used[55][55]; int N,m,sum; struct node{ int up,down,left,right; }; node n[11]={{1,0,1,0},{1,0,0,1},{0,1,1,0},{0,1,0,1},{1,1,0,0},{0,0,1,1},{1,0,1,1},{1,1,1,0},{0,1,1,1},{1,1,0,1},{1,1,1,1}}; //保存农田形状 int getnode(char x){ return x-'A'; } int cango(int x,int y){ if(x<=0||x>m||y<=0||y>N) return 0; return 1; } void dfs(int x,int y){ int i,j,k,xx,yy; for(i=0;i<4;i++){ if(i==0){ //上走 xx=x-1; yy=y; if(cango(xx,yy)&&!used[xx][yy]&&n[getnode(mp[xx][yy])].down&&n[getnode(mp[x][y])].up){ used[xx][yy]=1; dfs(xx,yy); } } else if(i==1){ xx=x+1; yy=y; if(cango(xx,yy)&&!used[xx][yy]&&n[getnode(mp[xx][yy])].up&&n[getnode(mp[x][y])].down){ used[xx][yy]=1; dfs(xx,yy); } } else if(i==2){ xx=x; yy=y-1; if(cango(xx,yy)&&!used[xx][yy]&&n[getnode(mp[xx][yy])].right&&n[getnode(mp[x][y])].left){ used[xx][yy]=1; dfs(xx,yy); } } else if(i==3){ xx=x; yy=y+1; if(cango(xx,yy)&&!used[xx][yy]&&n[getnode(mp[xx][yy])].left&&n[getnode(mp[x][y])].right){ used[xx][yy]=1; dfs(xx,yy); } } } } int main(){ int i,j,k; while(scanf("%d%d",&m,&N)&&N!=-1&&m!=-1){ sum=0; memset(used,0,sizeof(used)); for(i=1;i<=m;i++) for(j=1;j<=N;j++){ scanf("%1s",&mp[i][j]); } for(i=1;i<=m;i++) for(j=1;j<=N;j++){ if(used[i][j]==0){ sum++; dfs(i,j); } } cout<<sum<<endl; } return 0; }