题目描述:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1412
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn=50;
int r[4]= {0,-1,0,1},c[4]= {1,0,-1,0};
int A[3*maxn+10][3*maxn+10],ch[11][3][3];
int ind[maxn+10][maxn+10];
char s[maxn+10][maxn+10];
int m,n,ans;
void init()
{
ch[0]= {{0,1,0},{1,1,0},{0,0,0}};
ch[1]= {{0,1,0},{0,1,1},{0,0,0}};
ch[2]= {{0,0,0},{1,1,0},{0,1,0}};
ch[3]= {{0,0,0},{0,1,1},{0,1,0}};
ch[4]= {{0,1,0},{0,1,0},{0,1,0}};
ch[5]= {{0,0,0},{1,1,1},{0,0,0}};
ch[6]= {{0,1,0},{1,1,1},{0,0,0}};
ch[7]= {{0,1,0},{1,1,0},{0,1,0}};
ch[8]= {{0,0,0},{1,1,1},{0,1,0}};
ch[9]= {{0,1,0},{0,1,1},{0,1,0}};
ch[10]= {{0,1,0},{1,1,1},{0,1,0}};
}
bool charge(int x,int y)
{
if(x<0||y<0||x>=3*m||y>=3*n||A[x][y]==0) return false;
return true;
}
void dfs(int x,int y)
{
A[x][y]=0;
for(int i=0;i<4;i++)
{
int a=x+r[i];
int b=y+c[i];
if(charge(a,b)) dfs(a,b);
}
}
int main()
{
// freopen("in.txt","r",stdin);
init();
while(scanf("%d%d",&m,&n)&&m>0&&n>0)
{
ans=0;
for(int i=0; i<m; i++)
{
scanf("%s",s[i]);
}
for(int i=0; i<m; i++)
for(int j=0; j<n; j++)
{
ind[i][j]=int(s[i][j]-'A');
}
for(int i=0; i<m; i++)
for(int j=0; j<n; j++)
{
int tmp=ind[i][j];
for(int k=0; k<3; k++)
for(int t=0; t<3; t++)
{
A[3*i+k][3*j+t]=ch[tmp][k][t];
}
}
for(int i=0;i<3*m;i++)
for(int j=0;j<3*n;j++)
{
if(A[i][j]==1) {
dfs(i,j);
ans++;
}
}
printf("%d\n",ans);
}
return 0;
}