BFS_连连看游戏 一个让人感觉很复杂的BFS

该博客探讨了一种使用BFS算法解决连连看游戏的配对问题。题目描述了一个10*10的矩阵,其中包含若干对可配对的大写字母,需要找出配对顺序以确保所有字母都能配对成功。博客提到了输入输出要求,并给出了样例输入和输出。博主分享了对问题的理解,强调面对困难时应勇敢尝试,不必畏惧可能的超时或复杂性。
摘要由CSDN通过智能技术生成

问题 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值