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