http://acm.hdu.edu.cn/showproblem.php?pid=1198
思路:我们可以用二维数组记下字母的位置,但是每个方块都有上,下,左,右四个部分,所以我们要另加一维,保存它四个方位的状态.然后逐个往下搜,只要是能连接的都将其标记,如果深搜之后都还没标记,说明它是另一块的,ans++,直到最后结果就出来了.
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cctype>
#include<iomanip>
#include<queue>
using namespace std;
int n,m;
int map[52][52][4];
int vis[52][52];
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
void DFS(int sx,int sy){
for(int i=0;i<4;++i){
int x=sx+dx[i];
int y=sy+dy[i];
if(x<0||y<0||x>=n||y>=m||vis[x][y])continue;
int c;
if(i==0)c=2; if(i==1)c=3; if(i==2)c=0; if(i==3)c=1;///相邻的位置
if(map[sx][sy][i]&&map[x][y][c]){///相邻且相连接
vis[x][y]=1;
DFS(x,y);
}
}
}
int main(){
while(cin>>n>>m){
if(n<1||m<1)break;
for(int i=0;i<n;++i){
getchar();
for(int j=0;j<m;++j){
char g;cin>>g;
for(int t=0;t<4;++t)map[i][j][t]=0;
if(g=='A'||g=='B'||g=='E'||g=='G'||g=='H'||g=='J'||g=='K')map[i][j][0]=1;///上
if(g=='B'||g=='D'||g=='F'||g=='G'||g=='I'||g=='J'||g=='K')map[i][j][1]=1;///右
if(g=='C'||g=='D'||g=='E'||g=='H'||g=='I'||g=='J'||g=='K')map[i][j][2]=1;///下
if(g=='A'||g=='C'||g=='F'||g=='G'||g=='H'||g=='I'||g=='K')map[i][j][3]=1;///左
}
}
memset(vis,0,sizeof(vis));
int ans=0;
for(int i=0;i<n;++i)
for(int j=0;j<m;++j){
if(vis[i][j])continue;
ans++;
DFS(i,j);
}
cout<<ans<<endl;
}
return 0;
}