您的位置:首页 > 其它

迷宫寻宝(一)

2015-06-04 18:57 369 查看
描述
一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫里有N个编过号的门(N<=5),它们分别被编号为A,B,C,D,E.为了找到宝藏,ACM必须打开门,但是,开门之前必须在迷宫里找到这个打开这个门所需的所有钥匙(每个门都至少有一把钥匙),例如:现在A门有三把钥匙,ACM就必须找全三把钥匙才能打开A门。现在请你编写一个程序来告诉ACM,他能不能顺利的得到宝藏。

 

输入输入可能会有多组测试数据(不超过10组)。

每组测试数据的第一行包含了两个整数M,N(1<N,M<20),分别代表了迷宫的行和列。接下来的M每行有N个字符,描述了迷宫的布局。其中每个字符的含义如下:

.表示可以走的路

S:表示ACM的出发点

G表示宝藏的位置

X表示这里有墙,ACM无法进入或者穿过。

A,B,C,D,E表示这里是门,a,b,c,d,e表示对应大写字母的门上的钥匙。

注意ACM只能在迷宫里向上下左右四个方向移动。

最后,输入0 0表示输入结束。输出每行输出一个YES表示ACM能找到宝藏,输出NO表示ACM找不到宝藏。样例输入
4 4
S.X.
a.X.
..XG
....
3 4
S.Xa
.aXB
b.AG
0 0

样例输出
YES
NO


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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: