栈和队列的应用:迷宫问题
2017-10-06 14:39
351 查看
我们给出的迷宫如图:
其中,0表示通路,1表示障碍
代码实现如下:
其中,0表示通路,1表示障碍
代码实现如下:
#include <iostream> using namespace std; #include <assert.h> #include <stack> #include<iomanip> const int N = 10;//定义全局变量迷宫的大小(假设迷宫整体为正方形,行列相等) struct Pos { int Row; int Col; }; //void GetMaze(int (*maze) )//读取迷宫 //void GetMaze(int **maze)//读取迷宫(需要动态开辟空间) //void GetMaze(int maze[] )//读取迷宫 void GetMaze(int *maze)//读取迷宫 { FILE* pf = fopen("MazeMap.txt", "r"); assert(pf); char value = 0; for (size_t i = 0; i<N; i++) { for (size_t j = 0; j<N;) { value = fgetc(pf); if (value == '0' || value == '1') { maze[i*N + j] = value - '0'; j++; } else if (value == EOF) { cout << "maze error!" << endl; return; } } } fclose(pf); } void PrintMaze(int *maze)//打印迷宫 { cout << setw(4); for (size_t i = 0; i<N; i++) { for (size_t j = 0; j<N; j++) { cout << maze[i*N + j] << setw(4); } cout << endl; } } bool CheckIsAccess(int* maze, Pos cur, Pos next)//检查坐标是否合法 { //下一个坐标非法 if ((next.Row < 0) || (next.Row >= N) || (next.Col < 0) || (next.Col >= N)) { return false; } //下一个坐标合法 if (maze[next.Row*N + next.Col] == 0) { return true; } //下一个坐标是以前走过的坐标 if (maze[next.Row*N + next.Col] > maze[cur.Row*N + cur.Col] + 1) { return true; } return false; } void GetMazeMinPath(int* maze, Pos entry, stack<Pos>& path, stack<Pos>& min)//找通路 { assert(maze); path.push(entry); Pos cur = entry; Pos next = cur; //找到通路 if (cur.Col == N - 1) { if (min.empty() || path.size()<min.size()) { min = path; //cout<<"找到通路"<<endl; } path.pop(); return; } //探测上下左右四个方向是否可通 //上 next = cur; next.Row -= 1; if (CheckIsAccess(maze, cur, next)) { maze[next.Row*N + next.Col] = maze[cur.Row*N + cur.Col] + 1; GetMazeMinPath(maze, next, path, min); } //右 next = cur; next.Col += 1; if (CheckIsAccess(maze, cur, next)) { maze[next.Row*N + next.Col] = maze[cur.Row*N + cur.Col] + 1; GetMazeMinPath(maze, next, path, min); } //下 next = cur; next.Row += 1; if (CheckIsAccess(maze, cur, next)) { maze[next.Row*N + next.Col] = maze[cur.Row*N + cur.Col] + 1; GetMazeMinPath(maze, next, path, min); } //左 next = cur; next.Col -= 1; if (CheckIsAccess(maze, cur, next)) { maze[next.Row*N + next.Col] = maze[cur.Row*N + cur.Col] + 1; GetMazeMinPath(maze, next, path, min); } path.pop(); }
相关文章推荐
- 队列应用2:求解迷宫问题,最短路径
- 队列的应用——求解迷宫问题
- 栈的应用———迷宫问题
- java简单的迷宫问题——堆栈的应用
- 回溯算法经典应用之—迷宫问题 (Java)
- 栈的应用-迷宫问题-数据结构
- 农夫过河问题-队列的应用
- 队列应用1:求解报数问题
- poj3984迷宫问题 广搜+最短路径+模拟队列
- Java数据结构之回溯算法的递归应用迷宫的路径问题
- 利用BFS、队列求解迷宫问题
- C语言 迷宫问题求解(顺序栈应用示例)
- 迷宫问题(栈的应用)
- 数据结构5————栈的应用2-非递归解决迷宫和马踏棋盘问题
- 迷宫问题:hdoj1242--BFS基本应用
- 迷宫求解非递归 DFS BFS(应用栈和队列)
- 数据结构算法问题 栈与队列的应用
- 求解:栈的应用 深度优先搜索:迷宫问题
- 数据结构:栈和队列-迷宫问题求解
- 用栈和队列求解迷宫问题