迷宫出口以及迷宫最短路径的求解
来源:互联网 发布:网络推广赚钱吗 编辑:程序博客网 时间:2024/05/15 20:56
整理出来方便大家复习
//完成迷宫#pragma warning (disable:4996)#include<iostream>#include<vector>#include<stack>using namespace std;#include<assert.h>//创建迷宫->动态创建二维数组:1.int[][N] 2.int*->(二维数组是按照一维数组来存储的)//打印迷宫//走迷宫const size_t N = 10;//定义全局变量Nstruct Pos{ int _row; int _col;};//思考:三元组->适合适合什么问题?迷宫?二维数组?void InitMaze(int maze[][N]){ FILE*fout = fopen("MazeMap.txt", "r"); assert(fout); for (int i = 0; i < N; ++i) { for (int j = 0; j < N;) { //获取文件中的字符用fgetc() char ch = fgetc(fout); if (ch == '0' || ch == '1')//因为在文件中保存,所有数字均为字符数字 { maze[i][j] = ch-'0'; ++j; } } }}void PrintMaze(int maze[][N]){ for (int i = 0; i < N; ++i) { for (int j = 0; j < N; ++j) { cout << maze[i][j] << " "; } cout << endl; } cout << endl;}bool CheckAccess(int maze[][N], Pos tmp){ if (tmp._row >= 0 && tmp._row < N &&tmp._col >= 0 && tmp._col < N &&maze[tmp._row][tmp._col] == 0) { return true; } return false;}//获取迷宫路径void GetMazePath(int maze[][N], Pos entry){ //回溯法->将路径压入栈 //试探法,对每个方向进行试探一下 stack<Pos>path; path.push(entry); while (!path.empty()) { Pos cur = path.top(); Pos next = cur; if (cur._row == N - 1) { break; } //试探法,对每个方向进行试探一下 //上方 next._row--; if (CheckAccess(maze,next)) { maze[next._row][next._col] = 2; path.push(next); continue; } next = cur; //右方 next._col++; if (CheckAccess(maze, next)) { maze[next._row][next._col] = 2; path.push(next); continue; } next = cur; //下方 next._row++; if (CheckAccess(maze, next)) { maze[next._row][next._col] = 2; path.push(next); continue; } next = cur; //右方 next._col--; if (CheckAccess(maze, next)) { maze[next._row][next._col] = 2; path.push(next); continue; } //四个方向都走不通-》回溯法 maze[cur._row][cur._col] = 3; path.pop(); }}//求迷宫最优解:-》 //考虑两个问题:1.怎么标记的,还走回去?//2.递归怎么解决子问题//思路:肯定要把每个出口进行遍历,比较出一条最短的路径来bool CheckAccess(int maze[][N],size_t n, Pos next,Pos cur){ if (next._row >= 0 && next._row < n &&next._col >= 0 && next._col < n) { if (maze[next._row][next._col] == 0 || maze[next._row][next._col]>maze[cur._row][cur._col]) { return true; } } return false;}bool GetMazePathR(int maze[][N], size_t n,Pos cur,stack<Pos>&shortPath,stack<Pos>&path){ path.push(cur); if (cur._row == n - 1) { if (shortPath.empty() || path.size() < shortPath.size()) { shortPath = path; } //return true;//一旦找到路径就结束 } Pos next = cur; //四个方向进行检测 next._row++; if (CheckAccess(maze,n,next,cur)) { maze[next._row][next._col] = maze[cur._row][cur._col] + 1; if ( GetMazePathR(maze, n, next, shortPath, path)) { return true; } } next = cur; next._col++; if (CheckAccess(maze, n,next,cur )) { maze[next._row][next._col] = maze[cur._row][cur._col] + 1; if (GetMazePathR(maze, n, next, shortPath, path)) { return true; } } next = cur; next._row++; if (CheckAccess(maze, n,next,cur )) { maze[next._row][next._col] = maze[cur._row][cur._col] + 1; if (GetMazePathR(maze, n, next, shortPath, path)) { return true; } } next = cur; next._row--; if (CheckAccess(maze, n,next,cur )) { maze[next._row][next._col] = maze[cur._row][cur._col] + 1; if (GetMazePathR(maze, n, next, shortPath, path)) { return true; } } path.pop();//退到上一个路径上 return false;}int main(){ int maze[N][N]; InitMaze(maze); PrintMaze(maze); Pos entry = { 1,0 }; //GetMazePath(maze, entry); //PrintMaze(maze); stack<Pos>path; stack<Pos>shortPath; GetMazePathR(maze,N,entry,shortPath,path ); PrintMaze(maze); return 0;}
迷宫通路:
迷宫最优解:
0 0
- 迷宫出口以及迷宫最短路径的求解
- 迷宫最短路径求解
- BFS求解迷宫最短路径
- [数据结构]求解迷宫最短路径问题
- 迷宫最短路径求解(BFS)
- 递归和栈求解迷宫的最短路径
- 迷宫的最短路径
- 迷宫的最短路径
- 迷宫的最短路径
- 迷宫的最短路径
- 迷宫的最短路径
- 迷宫的最短路径
- 迷宫的最短路径
- 迷宫的最短路径
- 迷宫的最短路径
- 迷宫最短路径
- 迷宫最短路径
- 迷宫最短路径
- mysql中[Err] 1093
- 【带权并查集】 练习
- 【Java学习笔记】11.内部类
- request如何获取IP
- oracle数据库操作语句
- 迷宫出口以及迷宫最短路径的求解
- python二叉查找树
- html5移动场景网站
- ResultFul web service
- nRF51/52 ROM Protection : Prevent Someone Else From Dumping the Hex File
- php内置服务器
- 编写一个ORM框架
- 自定义控件经验总结
- jenkins+maven+svn实现简单的一键发布