BFS_连连看游戏 (bfs+贪心)

时间限制: 2 Sec  内存限制: 10 MB
提交: 325  解决: 49
[提交][状态][讨论版]

题目描述

大家都玩过连连看吧!今天我们玩一个类似的游戏。在一个由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!

这道题告诉我们在数据量较大或计算次数较多时,STL会超时,超时,超时!!!

这道题T了6发,没想到是用了queue的缘故。。。

由于输出字典序,那么就会用到贪心.

#include
using namespace std;
char g[12][12],a[12],b[12];
int vis[15],flag,v[15][15],xi,yi;
int dir[4][2]= {{1,0},{-1,0},{0,1},{0,-1}};
struct node
{
    int x,y;
}q[100005];
struct nod
{
    int x,y;
}s[100];
bool check(int x,int y,char ch)
{
    if(x>=1&&x<=10&&y>=1&&y<=10&&!v[x][y]&&g[x][y]!='#')
    {
        if(g[x][y]!=ch&&g[x][y]!='.')
            return false;
        v[x][y]=1;
        return true;
    }
    return false;
}
void bfs(char ch)
{
    int L=0,R=1;
    while(L

 

你可能感兴趣的:(ACM之BFS专题,bfs,贪心)