分析
利用dfs实现,特殊的是不同的点能搜索的范围是不一样的,只有下个点和当前点能够互相可达,才能去dfs下一个点,每次搜索时记录下能搜到的农田的个数。
#include<cstdio>
#include<map>
#include<cstring>
#define N 55
using namespace std;
char s[N][N];
bool v[N][N];
int cnt;
map<char,int>M;
int n,m;
int move[4][2]={{0,1},{0,-1},{1,0},{-1,0}};// r,l,down,up
bool p[N][4];
int check(int i){
switch(i){
case 0:return 1;
case 1:return 0;
case 2:return 3;
case 3:return 2;
}
}
void init(){
for(int i=0;i<11;i++)
M[i+'A']=i;
memset(p,1,sizeof(p));
p[0][0]=p[0][2]=0;
p[1][1]=p[1][2]=0;
p[2][3]=p[2][0]=0;
p[3][1]=p[3][3]=0;
p[4][0]=p[4][1]=0;
p[5][2]=p[5][3]=0;
p[6][2]=p[7][0]=p[8][3]=p[9][1]=0;
}
void dfs(int x,int y){
if(x<0||x>=n||y<0||y>=m)return;
if(v[x][y])return;
v[x][y]=1;
++cnt;
for(int i=0;i<4;i++){
if(p[M[s[x][y]]][i]){
int px=x+move[i][0];
int py=y+move[i][1];
if(p[M[s[px][py]]][check(i)])
dfs(px,py);
}
}
return;
}
int main(){
init();
while(~scanf("%d%d",&n,&m)){
if(n<0&&m<0)
return 0;
memset(v,0,sizeof(v));
for(int i=0;i<n;i++)
scanf("%s",s[i]);
int tot=n*m;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++){
cnt=0;
dfs(i,j);
if(cnt) tot-=(cnt-1);
}
printf("%d\n",tot);
}
return 0;
}
浙公网安备 33010602011771号