转载请注明出处:http://blog.youkuaiyun.com/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;
}