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; }
相关文章推荐
- (百度笔试)简要说明树的深度优先、广度优先遍历算法,及非递归实现的特点
- 41 数据结构笔记之四十一图的遍历之深度优先
- leetcode 473. Matchsticks to Square 火柴摆正方形 + 一个经典深度优先遍历DFS的应用
- 图(邻接表)的深度、广度优先遍历
- 第十二周项目3-图遍历算法实现(1-深度优先遍历)
- 第12周项目3-(1)图遍历算法实现、实现深度优先遍历—DFS
- 第十二周 - 项目5 - 迷宫问题之图深度优先遍历解法
- 第十二周 项目5 迷宫问题之图深度优先遍历解法
- 图的遍历(深度优先遍历)- 数据结构和算法59
- 【数据结构】图的遍历--深度优先搜索
- 图(三)图的遍历(深度优先和广度优先)
- java 图的邻接矩阵表示,深度优先遍历,广度优先遍历
- DFS-深度优先遍历
- 深度优先遍历与广度优先遍历 递归与非递归思路
- 图的邻接矩阵存储:深度、广度优先遍历
- 深度优先和广度优先遍历及其 Java 实现
- 数据结构与算法分析(Java语言描述)(17)—— 二叉搜索树的深度优先与广度优先遍历
- 图--深度优先遍历
- Java 图的建立及DFS深度优先遍历
- 深度优先遍历