您的位置:首页 > 编程语言 > Go语言

Algorithm Design——深度优先遍历

2013-12-01 11:12 148 查看
/**
通过一个题目来认识深度优先搜索
题目描述:
一个N*M迷宫,入口S,出口D,能走的是.,不能走的是X,问从入口进入后能否在T时间内走出迷宫?

输入:
N,M,T分别代表迷宫的长度和宽度以及时间,注意三者输入都是0时,结束

输出:
能走出为YES;不能走出为NO

样例输入:
4 4 5
S.X.
..X.
..XD
....
3 4 5
S.X.
..X.
...D
0 0 0

样例输出:
NO
YES
代码用VS2012有点儿小问题哈~*/

#include<cstdio>
#include<cstdlib>
using namespace std;

char maze[101][101];//保存地图信息
int n, m ,t;//地图大小为n * m,从起点到终点能否恰为t秒
bool success;//是否找到所需状态标记
int go[][2] = {1, 0, -1, 0, 0, 1, 0, -1};//四方向行走坐标差

//递归形式的深度优先搜索
void DFS(int x, int y, int time)
{
//枚举四个相邻位置
for(int i = 0 ; i < 4 ; i ++)
{
//nx表示上下坐标,ny表示左右坐标,其实是一样的~~
int nx = x + go[i][0];
int ny = y + go[i][1];//计算其坐标

if(nx < 1 || nx > n || ny < 1 || ny > m)//超出界限
continue;

if(maze[nx][ny] == 'X')//路障
continue ;
if(maze[nx][ny] == 'D')//出口
{
if(time + 1 == t)//再走一步,时间恰好为t,皆大欢喜
{
success  = true;
return ;
}
else
continue;
}
maze[nx][ny] = 'X';//将走过的格子设为路障

DFS(nx, ny, time +1);//递归进行下一次搜索
maze[nx][ny] = '.';//若其后状态全部搜索完毕,则退回上层状态,将因为搜索其后续状态改成路障的位置改为普通位置

if(success)
return ;
}
}

int main()
{
while(scanf_s("%d%d%d", &n, &m, &t) != EOF)
{
if( n ==0 && m == 0 && t ==0)
break;
getchar();
for(int i = 1 ; i <= n ; i ++)
{
gets_s(maze[i] + 1, m);
}//输入

success = false;//初始化成功标记

//找到出口
int sx, sy;
for(int i = 1 ; i <= n ; i ++)
{
for(int j = 1 ; j <= m ; j ++)
{
if(maze[i][j] == 'D')
{
sx = i;
sy = j;
}
}
}
for(int i = 1 ; i <= n ; i ++)
{
for(int j = 1 ; j <= m ; j ++)
{
//找到S点后,先判断S与D的就关系,是否符合t,不符合的话直接跳过搜索
if(maze[i][j] == 'S' && (i + j) % 2 == ((sx + sy) % 2 + t % 2) % 2 )
{
maze[i][j] = 'X';
DFS(i, j, 0);
}
}
}

puts(success == true ? "YES" : "NO");//输出结果
}

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