Advertisement

迷宫寻宝(一)

阅读量:

描述

被称为ACM的寻宝者发现了一份藏宝图,并基于此确定了一个迷宫的位置。这个迷宫具有独特的特征:它包含N个标号为A到E的门(其中N不超过5),每个门都需要特定的一把或多把钥匙才能打开。为了开启宝藏之门,请设计一个算法来帮助ACM判断他是否能够顺利获取宝藏。

可能包含多组测试数据的数量(最多10组)。每组测试数据的第一行都包含两个整数M和N(满足1<N,M<20)。接下来的M行每一行都有N个字符描述了迷宫的情况。其中.代表可通行的道路S表示起始位置G代表宝藏的位置X表示此处有墙A,B,C,D,E代表门的位置a,b,c,d,e分别代表相应大写字母对应的门上的钥匙注意者ACM仅能在迷宫内上下左右四个方向移动

最后,输入0 0表示输入结束。

输出 每行输出一个YES表示ACM能找到宝藏,输出NO表示ACM找不到宝藏。

样例输入

复制代码

样例输出

复制代码

ac代码:

复制代码
 #include<iostream>

    
 #include<cstring>
    
 using namespace std;
    
 struct node
    
 {
    
     int b;
    
     int c;
    
     int num;
    
 }arry[5];
    
 char a[25][25];
    
 int keynum[5];
    
 int have[5];
    
 int bz;//宝藏找到的标志
    
 void jc();
    
 void dfs(int x,int y)
    
 {
    
     if(a[x][y]!='X')//没碰到墙
    
     {
    
     if(a[x][y]>='a'&&a[x][y]<='e')//记录钥匙数量
    
     {keynum[a[x][y]-'a']++;}
    
     else
    
     {
    
     if(a[x][y]>='A'&&a[x][y]<='E') //碰到门了
    
       {
    
         arry[a[x][y]-'A'].b=x;//记录门的坐标
    
         arry[a[x][y]-'A'].c=y;
    
         arry[a[x][y]-'A'].num++;
    
         return;
    
       }
    
     else
    
       {if(a[x][y]=='G')//碰到宝藏
    
         {bz=1;return;}
    
       }
    
     }
    
     a[x][y]='X';
    
     dfs(x-1,y);
    
     dfs(x+1,y);
    
     dfs(x,y-1);
    
     dfs(x,y+1);
    
     jc();
    
     }
    
 }
    
 void jc()
    
 {
    
     for(int i=0;i<5;i++)
    
     {
    
     if(arry[i].num)
    
     {
    
         if(have[i]==keynum[i])
    
         {
    
             a[arry[i].b][arry[i].c]='X';
    
             dfs(arry[i].b+1,arry[i].c);
    
             dfs(arry[i].b-1,arry[i].c);
    
             dfs(arry[i].b,arry[i].c+1);
    
             dfs(arry[i].b,arry[i].c-1);
    
         }
    
     }
    
     }
    
 }
    
 int main()
    
 {
    
     int q,w,m,n,i,j;
    
  
    
    while((cin>>q>>w)&&(q||w))
    
     {
    
     memset(a,'X',sizeof(a));//划分范围边界
    
     memset(have,0,sizeof(have));
    
     memset(keynum,0,sizeof(keynum));
    
     memset(arry,0,sizeof(arry));
    
     bz=0;
    
     for(i=1;i<=q;i++)
    
     for(j=1;j<=w;j++)
    
      {
    
        cin >>a[i][j];
    
        if(a[i][j]>='a'&&a[i][j]<='e')
    
        have[a[i][j]-'a']++;
    
        else if(a[i][j]=='S')//记录起点
    
        m=i,n=j;
    
      }
    
    dfs(m,n);
    
    if(bz)
    
    cout<<"YES"<<endl;
    
    else
    
    cout<<"NO"<<endl;
    
     }
    
     return 0;
    
 }

全部评论 (0)

还没有任何评论哟~