边枚举,边搜索。
#include<stdio.h>
#include<string.h>
typedef struct {
int x,y;
}Queue;
Queue queue[500];
char map[11][11],ans[11];
int visit[11][11];
int dir[4][2]={1,0,0,1,-1,0,0,-1};
int bfs(int x,int y){
memset(visit,0,sizeof(visit));
int i;
int t1,t2,t3,t4;
int t,w;
t = w = 1;
queue[t].x = x;
queue[t].y = y;
visit[x][y] = 1;
bool neng = true;
while(t<=w && neng){
t1 = queue[t].x;
t2 = queue[t].y;
for(i=0;i<4;i++){
t3 = t1 + dir[i][0];
t4 = t2 + dir[i][1];
if(t3>=0 && t3<10 && t4>=0 && t4<10 && !visit[t3][t4] && (map[t3][t4]=='.' || map[t3][t4]==map[x][y])){
visit[t3][t4] = 1;
queue[++w].x = t3;
queue[w].y = t4;
if(map[t3][t4] == map[x][y]){
map[t3][t4] = map[x][y] = '.';
neng = false;
break;
}
}
}
t++;
}
if(neng) return 0;
else return 1;
}
int main(){
int n;
int many;
int i,j,k;
bool neng,neng1;
scanf("%d",&n);
getchar();
while(n--){
for(i=0;i<10;i++) scanf("%s",map[i]);
many = 0;
neng = false;
while(!neng){
neng = true;
for(i=0;i<=25 && neng;i++){
neng1 = true;
for(j=0;j<10 && neng1;j++){
for(k=0;k<10 && neng1;k++){
if(map[j][k] == i+65){
if(bfs(j,k)) neng = neng1 = false;
else neng1 = false;
}
}
}
}
if(!neng ) ans[++many ] = i-1;
}
for(i=0;i<10 && neng;i++){
for(j=0;j<10 && neng;j++){
if(map[i][j]!='.' && map[i][j]!='#') {
neng = false;
break;
}
}
}
if(!neng) printf("My God!\n");
else {
for(i=1;i<=many;i++) printf("%c",ans[i]+65);
printf("\n");
}
}
return 0;
}