迷宫问题DFS
2014-10-07 13:56
162 查看
二维整数矩阵a
表示一个迷宫,矩阵左上角表示迷宫入口,右下角表示出口。矩阵的元素为0表示可以通过,为1表示不能够通过。如
maze[5][5]=
{0, 1, 1, 1, 1,
0, 0, 0, 0, 0,
0, 1, 0, 1, 0,
0, 1, 0, 1, 0,
0, 0, 0, 0, 0};
则迷宫的一条通往出口的路径为(0, 0)->(1, 0)->(2, 0)->(3, 0)->(4, 0)->(4, 1)->(4, 2)->(4, 3)->(4, 4)。
设计一个算法,求通往迷宫出口的所有路径。
可以考虑使用DFS算法,将已经访问过的矩阵元素做一个标记,以防止路径产生回路,从而产生死循环。但是,简单的对元素进行访问标记会遗漏一些路径。
这是因为,通往迷宫出口的不同路径有可能有交点。当所有路径的交点多于两个时,由于先获取的路径会将交点元素标记为已经访问。当存在其他通过该节点的路径
时,由于该交点已经被标记为已访问,所以其他的通过该交点的路径将被忽略。
解决这个问题只需要对算法稍加改动即可。思路为:当某一个节点DFS完成后,擦除该节点的访问痕迹。
代码如下:
表示一个迷宫,矩阵左上角表示迷宫入口,右下角表示出口。矩阵的元素为0表示可以通过,为1表示不能够通过。如
maze[5][5]=
{0, 1, 1, 1, 1,
0, 0, 0, 0, 0,
0, 1, 0, 1, 0,
0, 1, 0, 1, 0,
0, 0, 0, 0, 0};
则迷宫的一条通往出口的路径为(0, 0)->(1, 0)->(2, 0)->(3, 0)->(4, 0)->(4, 1)->(4, 2)->(4, 3)->(4, 4)。
设计一个算法,求通往迷宫出口的所有路径。
可以考虑使用DFS算法,将已经访问过的矩阵元素做一个标记,以防止路径产生回路,从而产生死循环。但是,简单的对元素进行访问标记会遗漏一些路径。
这是因为,通往迷宫出口的不同路径有可能有交点。当所有路径的交点多于两个时,由于先获取的路径会将交点元素标记为已经访问。当存在其他通过该节点的路径
时,由于该交点已经被标记为已访问,所以其他的通过该交点的路径将被忽略。
解决这个问题只需要对算法稍加改动即可。思路为:当某一个节点DFS完成后,擦除该节点的访问痕迹。
代码如下:
#include<iostream> #include<deque> using namespace std; class Point { public: int i; int j; Point(int x, int y) { i=x; j=y; } };// 节点坐标结构体 deque<Point> q;// 用一个队列记录路径 int N=5;// 迷宫的大小 int maze[5][5]= {0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0};// 迷宫矩阵 int path[5][5]= {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};// 访问标记矩阵 void dfs(int i, int j); void main() { path[0][0]=1; q.push_back(Point(0, 0)); dfs(0, 0); q.pop_back(); //system("pause"); } void dfs(int i, int j) { if(N-1==i && N-1==j) { path[i][j]=0; cout<<"Path:"<<endl; for(deque<Point>::iterator it=q.begin(); it!=q.end(); it++) { cout<<(*it).i<<", "<<(*it).j<<endl; } return; } if(i>0 && 1!=maze[i-1][j] && 1!=path[i-1][j]) { path[i-1][j]=1;// 标记节点已经被访问过,避免路径产生回路,从而产生死循环 q.push_back(Point(i-1, j)); dfs(i-1, j); q.pop_back(); //path[i-1][j]=0; } if(i<N-1 && 1!=maze[i+1][j] && 1!=path[i+1][j]) { path[i+1][j]=1; q.push_back(Point(i+1, j)); dfs(i+1, j); q.pop_back(); //path[i+1][j]=0; } if(j>0 && 1!=maze[i][j-1] && 1!=path[i][j-1]) { path[i][j-1]=1; q.push_back(Point(i, j-1)); dfs(i, j-1); q.pop_back(); //path[i][j-1]=0; } if(j<N-1 && 1!=maze[i][j+1] && 1!=path[i][j+1]) { path[i][j+1]=1; q.push_back(Point(i, j+1)); dfs(i, j+1); q.pop_back(); //path[i][j+1]=0; } path[i][j]=0;// 擦除访问痕迹 }
相关文章推荐
- 迷宫问题:hdoj1010 DFS--剪枝实现
- ACM水题-Rescue LK(AC,迷宫问题,DFS求解)
- 罗密欧与朱丽叶的迷宫问题_dfs
- SDUT 1157-小鼠迷宫问题(BFS&DFS)
- SDUT1157:小鼠迷宫问题(bfs+dfs)
- POJ 2251 (三维迷宫问题) DFS /BFS
- 迷宫问题二 统计路径条数(dfs+回溯)
- ytu 1980:小鼠迷宫问题(DFS 深度优先搜索)
- 小鼠迷宫问题【sdut1157】【dfs,bfs综合题目】
- FZU - 1205 小鼠迷宫问题 (bfs+dfs)
- (dfs+bfs+记录)迷宫问题(P3984)
- [置顶] 模拟求解迷宫问题(DFS+BFS)
- 模拟求解迷宫问题(DFS+BFS)
- BFS 、DFS 解决迷宫入门问题
- poj 3984 迷宫问题 dfs 求迷宫路径
- The problem of maze(经典迷宫问题) DFS版
- 经典迷宫问题DFS
- poj3984(DFS写法) 迷宫路径问题
- FZU1205/SDUT1157_小鼠迷宫问题(DFS+BFS)
- 迷宫问题一 找到迷宫的一条路径(DFS+回溯)