您的位置:首页 > 其它

nyoj 82 迷宫寻宝(一)【dfs】

2017-02-28 17:25 316 查看


迷宫寻宝(一)

时间限制:1000 ms | 内存限制:65535 KB
难度:4

描述

一个叫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 <stdio.h>
# include <string.h>
# define N 25

struct Door
{
int x;		 //门的位置的横坐标
int y;		 //门的位置的纵坐标
int flag;    //门的标记
int findnum; //能找到当前门的钥匙的数量
int key;     //地图中门的钥匙的总数量
};
Door d[5];

char map

; //地图
int sx, sy;		//入口坐标
int ok;			//剪枝标记
int col, row;	//寻宝人当前的坐标

void dfs(int x, int y);

void isok()
{
for (int k = 0; k < 5; k++)
{
if (d[k].flag && d[k].key == d[k].findnum)  //拦路之门已开
{
int x = d[k].x;
int y = d[k].y;
map[x][y] = 'X'; //标记已经走过
dfs(x+1, y); //向下走
dfs(x, y-1); //向右走
dfs(x-1, y); //向上走
dfs(x, y+1); //向右走
}
}
}

void dfs(int x, int y)
{
if (ok)
{
return ;
}
if (map[x][y] != 'X')
{
switch (map[x][y])
{
case 'G' :
ok = 1;
return ;
case 'A' :
case 'B' :
case 'C' :
case 'D' :
case 'E' :
d[map[x][y] - 'A'].x = x;
d[map[x][y] - 'A'].y = y;
d[map[x][y] - 'A'].flag ++;
return ;
case 'a' :
case 'b' :
case 'c' :
case 'd' :
case 'e' :
d[map[x][y] - 'a'].findnum ++;
break;
}
map[x][y] = 'X'; //标记已经走过
dfs(x+1, y); //向下走
dfs(x, y-1); //向右走
dfs(x-1, y); //向上走
dfs(x, y+1); //向右走
isok();
}
}

int main(void)
{
while (scanf("%d %d", &row, &col), row != 0 || col != 0)
{
int i, j;
ok = 0;

memset(map, 'X', sizeof(map));

for (int k = 0; k < 5; k++)
{
d[k].flag = 0;
d[k].key = 0;
d[k].findnum = 0;
}
for (i = 1; i <= row; i++)
{
scanf("%s", &map[i][1]);
for (j = 1; j <= col; j++)
{
switch (map[i][j])
{
case 'S' :
sx = i;
sy = j;
break;
case 'a' :
case 'b' :
case 'c' :
case 'd' :
case 'e' :
d[map[i][j] - 'a'].key ++;
break;
}
}
}
dfs(sx, sy);
if (ok)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  nyoj 算法 dfs