递归求解,代码不太好看,是2013年7月写的
代码:
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<math.h> using namespace std; char s[][];
int flag[];
int res[];
int tag1[]; int zong,heng;
int tag;
int n,m; int zhao(int qix,int qiy,int zhx,int zhy)
{
int fff=;
for(int i=qix;i<zhx;i++)
{
for(int j=qiy;j<zhy;j++)
{
if(s[i][j]=='.')
continue;
flag[s[i][j]-'A']=;
int ny;
for(ny=j;ny<zhy;ny++)
{
if(s[i][ny]!=s[i][j])
break;
}
heng=ny-;
int nx;
for(nx=i;nx<zhx;nx++)
{
if(s[nx][j]!=s[i][j])
break;
}
zong=nx-;
int cnt=;
tag=;
if(zong!=i&&heng!=j&&zong-i>=&&heng-j>=)
{
for(ny=j;ny<=heng;ny++)
{
if(s[zong][ny]==s[i][j])
cnt++;
else
break;
}
if(cnt==heng-j+)
{
cnt=;
for(nx=i;nx<=zong;nx++)
{
if(s[nx][heng]==s[i][j])
cnt++;
else
break;
}
if(cnt==zong-i+)
tag=;
else
tag=;
}
if(tag)
{
tag1[s[i][j]-'A']++;
fff=;
if(zhao(i+,j+,zong,heng)==)
{
if(tag1[s[i][j]-'A']!=)
tag1[s[i][j]-'A']=;
} }
}
else
tag1[s[i][j]]=;
}
}
return fff;
} int main()
{ while(scanf("%d%d",&n,&m)!=EOF)
{
memset(flag,,sizeof(flag));
memset(tag1,,sizeof(tag1));
int i;
if(n==&&m==)
break;
for(i=;i<n;i++)
scanf("%s",s[i]);
zhao(,,n,m); int cn=;
for(i=;i<;i++)
{
if(tag1[i])
res[cn++]=i;
}
sort(res,res+cn);
for(i=;i<cn;i++)
printf("%c",res[i]+'A');
printf("\n");
}
return ;
}