迷宫寻宝(一)
发布时间
阅读量:
阅读量
描述
被称为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)
还没有任何评论哟~
