这个题目,比较恶心,思路很是简单,就是模拟的时候有些麻烦......水题
#include<iostream> #include<cstdio> #include<cstring> using namespace std; char s[100][100]; int t[400][400],vist[400][400]; int n,m; int p[13][3][3]={ { 0,1,0, 1,1,0, 0,0,0 }, { 0,1,0, 0,1,1, 0,0,0, }, { 0,0,0, 1,1,0, 0,1,0, }, { 0,0,0, 0,1,1, 0,1,0, }, { 0,1,0, 0,1,0, 0,1,0, }, { 0,0,0, 1,1,1, 0,0,0, }, { 0,1,0, 1,1,1, 0,0,0, }, { 0,1,0, 1,1,0, 0,1,0, }, { 0,0,0, 1,1,1, 0,1,0, }, { 0,1,0, 0,1,1, 0,1,0, }, { 0,1,0, 1,1,1, 0,1,0, } }; int fx[4][2]={1,0,-1,0,0,1,0,-1}; void dfs(int x,int y) { for(int i=0;i<4;i++) { int mx=fx[i][0]+x; int my=fx[i][1]+y; if(0<=mx&&mx<3*n&&my>=0&&my<3*m&&!vist[mx][my]&&t[mx][my]==1) { vist[mx][my]=1; dfs(mx,my); } } } int main() { while(scanf("%d%d",&n,&m)>0) { if(n==-1&&m==-1) break; for(int i=0;i<n;i++) scanf("%s",s[i]); int cnt=0; memset(t,0,sizeof(t)); memset(vist,0,sizeof(vist)); for(int i=1;i<3*n;i+=3) { //if(i%2==0) //continue; for(int j=1;j<3*m;j+=3) { //if(j%2==0) //continue; int tmp=i-1; int tmp1=j-1; int hang=cnt/m; int lie=cnt%m; int x=s[hang][lie]-'A'; cnt++; for(int r=tmp;r<=i+1;r++) for(int ll=tmp1;ll<=j+1;ll++) { if(t[r][ll]==0) t[r][ll]=p[x][r-tmp][ll-tmp1]; } } } /*for(int i=0;i<3*n;i++) { for(int j=0;j<3*m;j++) printf("%d",t[i][j]); printf(" "); }*/ int sum=0; for(int i=1;i<3*n;i+=3) { for(int j=1;j<3*m;j+=3) { if(!vist[i][j]&&t[i][j]==1) { dfs(i,j); sum++; } } } printf("%d ",sum); } return 0; }