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<bits/stdc++.h>
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<R)
    {
        int px=q[L].x,py=q[L].y;
        L++;
        if(g[px][py]==ch&&!v[px][py])
        {
            flag=0;
            xi=px,yi=py;
            return;
        }
        for(int i=0; i<4; i++)
        {
            int newx=px+dir[i][0];
            int newy=py+dir[i][1];
            if(!check(newx,newy,ch))
                continue;
            if(g[newx][newy]==ch)
            {
                flag=0;
                xi=newx,yi=newy;
                return;
            }
            q[R].x=newx,q[R].y=newy;
            R++;
        }
    }

}
int main()
{
    int t,n;
    scanf("%d",&t);
    while(t--)
    {
        n=0;
        memset(vis,0,sizeof(vis));
        for(int i=1; i<=10; i++)
        {
            scanf("%s",g[i]+1);
            for(int j=1; j<=10; j++)
            {
                if(!vis[g[i][j]-'A'+1]&&g[i][j]!='.'&&g[i][j]!='#')
                {
                    a[n++]=g[i][j],vis[g[i][j]-'A'+1]=1;
                    s[g[i][j]-'A'].x=i;
                    s[g[i][j]-'A'].y=j;
                }
            }

        }
        memset(vis,0,sizeof(vis));
        sort(a,a+n);
        int k=0,m=0;
        while(m<n)
        {
            flag=1;
            m++;
            for(int i=0; i<n&&flag; i++)
            {
                if(vis[a[i]-'A']) continue;
                memset(v,0,sizeof(v));
                q[0].x=s[a[i]-'A'].x;
                q[0].y=s[a[i]-'A'].y;
                v[s[a[i]-'A'].x][s[a[i]-'A'].y]=1;
                bfs(a[i]);
                if(!flag)
                {
                    vis[a[i]-'A']=1;
                    b[k++]=a[i];
                    g[s[a[i]-'A'].x][s[a[i]-'A'].y]='.';
                    g[xi][yi]='.';
                    break;
                }
            }
        }
        if(k<n)
            printf("My God!\n");
        else
        {
            for(int i=0;i<n;i++) printf("%c",b[i]);
            printf("\n");
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_41061455/article/details/81362586