<span style="font-size:18px;"><span style="font-size:18px;">#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int grid[201][201],m,n,flag,vis[201][201];
int mov[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
char r[6]={'W','A','K','J','S','D'};
bool cmp(char a,char b)
{
return a<b;
}
void dfs(int r,int c,int id,int mark1,int mark2)//id代表是第几个连通的图形,mark1代表是搜哪种连通,是搜图形还是空白,其实是一样的,就可以合成一个函数;mark2代表边界是哪个图形的,空白处的边界必须是同一个图形的。
{
if(r<0||r>=m||c<0||c>=4*n){flag=1;return;}
if(grid[r][c]!=mark1)
{
if(vis[r][c]!=mark2)flag=1;
return;
}
if(vis[r][c])return;
vis[r][c]=id;
for(int i=0;i<4;i++)dfs(r+mov[i][0],c+mov[i][1],id,mark1,mark2);
}
int main()
{
int j,t,tmp,l,ans[100],k,num=1;
char str[51],ans2[100];
while(scanf("%d%d",&m,&n)!=EOF)
{
if(m==0&&n==0)break;
int cnt=1;
memset(vis,0,sizeof(vis));
memset(ans,0,sizeof(ans));
for(j=0;j<m;j++)//录入数据
{
scanf("%s",str);
for(tmp=0,k=0;k<n;k++)
{
if(str[k]>='0'&&str[k]<='9')t=str[k]-'0';//十六进制转化成十进制
else if(str[k]>='a'&&str[k]<='f')t=str[k]-'a'+10;
tmp+=4;
for(l=0;l<4;l++)//十六进制转化成二进制存进数组
{
grid[j][--tmp]=t%2;
t=t/2;
}
tmp+=4;
}
}
for(k=0;k<m;k++)//第一次搜,找有几个图形,不连通的图形用不同的数字(cnt)标记
for(l=0;l<4*n;l++)
if(vis[k][l]==0&&grid[k][l]==1)dfs(k,l,++cnt,1,0);
for(k=0;k<m;k++)//第二次搜,找每个图形当中有多少个空白处
for(l=0;l<4*n;l++)
if(vis[k][l]==0&&grid[k][l]==0&&grid[k][l-1]!=0)
{
flag=0;
dfs(k,l,1,0,vis[k][l-1]);
if(flag==0)ans[vis[k][l-1]-2]++;
}
for(k=0;k<cnt-1;k++)ans2[k]=r[ans[k]];
sort(ans2,ans2+cnt-1,cmp);
printf("Case %d: ",num++);
for(k=0;k<cnt-1;k++)printf("%c",ans2[k]);
printf("\n");
}
return 0;
}</span></span>
用这题复习了dfs==发现自己都忘的差不多了,不是特别难的一题花了快4个小时才做完。。。