问题 D: BFS_连连看游戏
时间限制: 2 Sec
内存限制: 5 MB
提交: 12
解决: 3
[ 提交][ 状态][ 讨论版]
题目描述
大家都玩过连连看吧!今天我们玩一个类似的游戏。在一个由10*10个小方格组成的矩形里有n(n<=10)对字符(它们是大写字符中的前n个)。矩形里有些位置是可以从上面走过,有些则不能。能走过的位置用'.'标识,不能的用'#'标识。如果2个相同字符是连通的(从一个字符能走到另一个字符,注意走的时候只能向上、下、左、右走。某个位置是有其他字符时,这个位置是不能走的),那么这对字符能够进行配对。如果将这对字符配对,这对字符将从这个矩形里消除,也就是说这2个字符所在的位置对于其他字符而言变成能走动了。
现在的问题是:请你决定这些字符的配对顺序(只有能配对才能进行配对),使得n对字符最后都配对成功。
输入
先给出一个正整数t(t<=10),表示有t组测试数据。
每组测试数据有10行组成,每行有10个字符。这些字符只能是'.','#',或者是大写字符中的前n个。每组测试数据中不超过10对字符。
输出
如果能够使每组测试数据中的n对字符配对成功,输出配对的顺序。如果有多种配对成功的顺序,输出字典序最小的那组。
否则输出"My God!"。
样例输入
2
ABF.......
CE........
D.........
..........
..........
..........
..........
.........D
........EC
.......FBA
ABF.......
CE........
D.........
..........
..........
.........#
........#D
.........#
........EC
.......FBA
样例输出
DCABEF
My God!
参考了下老师的代码 其实我一直的思路也都是这样的 而且还动手写了 但是都是写到一半的时候放弃了 因为心里畏惧 害怕超时
还害怕复杂 以后做一个题目的时候要是有一定的把握就不要畏惧 不要婆婆妈妈的 大大方方的把代码敲出来 干掉它
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
int step[4][2]={-1,0,1,0,0,-1,0,1};
char map[11][11];
int used[11][11];
char ans[20];
struct haha
{
int x;
int y;
int step;
friend bool operator <(struct haha a,struct haha b)
{
return a.step>b.step;
}
}q,temp;
int BFS(int x,int y)
{
int x1,y1,i;
priority_queue<struct haha>que;
memset(used,0,sizeof(used));
q.x=x;q.y=y;q.step=0;
used[x][y]=1;
que.push(q);
while(!que.empty())
{
temp=que.top();
que.pop();
for(i=0;i<4;i++)
{
x1=temp.x+step[i][0];
y1=temp.y+step[i][1];
if(x1>=0&&x1<10&&y1>=0&&y1<10&&!used[x1][y1]&&(map[x1][y1]=='.'||map[x1][y1]==map[x][y]))
{
if(map[x1][y1]==map[x][y])
{
map[x1][y1]='.'; map[x][y]='.';return 1;
}
q.x=x1;
q.y=y1;
q.step=temp.step+1;
que.push(q);
used[x1][y1]=1;
}
}
}
return 0;
}
int main()
{
int cas,k;
while(scanf("%d",&cas)!=EOF)
{
while(cas--)
{
int i,j,end=0,end2,flag=0,cnt=0;
for(i=0;i<10;i++)
scanf("%s",map[i]);
while(!end)
{
for(k='A';k<='M'&&!end;k++)/*借鉴老师的方法感觉比较好 一开始就是怕处理太麻烦不敢下手其实只要试着去做的时候才会发现其实没那么复杂*/
{
end2=0;
for(i=0;i<10&&!end2;i++)
for(j=0;j<10&&!end2;j++)//这个终止方法好漂亮啊 省去了一堆break 以前的方法太笨了
{
if(map[i][j]==k)
{
if(BFS(i,j)) {ans[cnt++]=k;end=end2=1;}
else end2=1;
}
}
}
if(end==0) break;
end=0;
}
for(i=0;i<10;i++)
for(j=0;j<10;j++)
{
if(map[i][j]!='.'&&map[i][j]!='#')
{flag=1;break;}
}
if(flag) printf("My God!\n");
else
{
for(i=0;i<cnt;i++)
printf("%c",ans[i]);
printf("\n");
}
}
}
return 0;
}