迷宫问题求解
来源:互联网 发布:win10开机windows聚焦 编辑:程序博客网 时间:2024/06/08 18:23
迷宫问题求解
这几天,我刚开始学习一些数据结构,这不刚学习《栈》 ,,,学了之后就要知道怎么用它,实际上生活中要用
到栈的地方很多。。。。
比如说 我们今天要说的迷宫问题 ,,,,,我们给一个迷宫 ,,,,再知道迷宫的入口。。。。
然后借此再来计算是否能走通这个迷宫,如果并求出走出的最短路径。。。。。
如果要解决这个问题 ,,,我们就要使用到栈这个数据结构了 ,,,,栈结构的特点就是 后进先出 所以我们可以通过栈的这种特点来进行试着走通 道路,如果路通 , ,,,将这个位置压栈 ,,,,再来判断下一个位置 ,,,如果走不同的话 ,,我们可以通过取栈顶元素 为上次走的路径 ,然后出栈 ,,,, , ,知道在别的方位找到出路
话说的再多还是要实现代码才算回事!!!!!
下面就让我来手动实现一下这个迷宫问题的求解
这就是迷宫的地图的表示方法 , , , ,其中 1表示此路不通 ,, , , 0 表死该路可通
代码
#pragma once#include<iostream>#include<assert.h>#include<stack>#include<string>using namespace std;//声明一个数组 表示的所要压栈的元素的坐标struct Pos{size_t row;//压栈位置的行size_t col;//压栈位置的列};//初始化建立一个迷宫 其中1表示不通 ,, 0表示此路通void SetMaze(int **&maze,size_t &N)//传的参数maze表示的是表示迷宫的二位数组 ,N表示的是迷宫的大小{FILE * fp = fopen("maze.txt", "r");//从文件中读取数据用来创建迷宫assert(fp);char str[15];fgets(str, 256, fp);N = atoi(str);//读取第一个数作为迷宫的大小 ,,赋值给Nmaze = new int*[N];for (size_t i = 0; i < N; i++)//动态开辟二维数组{maze[i] = new int[N];}for (size_t i = 0; i < N; i++){for (size_t j = 0; j < N;){int value = fgetc(fp);if (value - '0' == 1 || value - '0' == 0){maze[i][j] = value-'0';++j;}if (value == EOF){assert(false);//若给的迷宫出现问题 例如数据缺失直接报错}}}fclose(fp);//用完后将文件关掉}
//判断位置是不是可通bool checkPos(int **maze,Pos &next,size_t N){if (next.col < N && next.row < N&& next.col >= 0 && next.row >= 0&&maze[next.row][next.col]==0){return true;}return false;}//栈求迷宫是否可通bool IsHasPath(int ** maze, size_t N, stack<Pos> &path, Pos entry){path.push(entry);maze[entry.row][entry.col] = 2;//将走过的路都赋值给2while (!path.empty()){Pos cur = path.top();Pos next;if ((cur.row == N - 1 || cur.col == 0 || cur.row == 0 || cur.col == N - 1)&& cur.col != entry.col && cur.row != entry.row)//判断是不是出口return true;//判断四面是否可tong//上next = cur;next.row -= 1;if (checkPos(maze, next, N))//判断此方向位置是不是可通{path.push(next);maze[next.row][next.col] = 2;continue;}//右next = cur;next.col += 1;if (checkPos(maze, next, N))//判断此方向位置是不是可通{path.push(next);maze[next.row][next.col] = 2;continue;}//下next = cur;next.row += 1;if (checkPos(maze, next, N))//判断此方向位置是不是可通{path.push(next);maze[next.row][next.col] = 2;continue;}//左next = cur;next.col -= 1;if (checkPos(maze, next, N))//判断此方向位置是不是可通{path.push(next);maze[next.row][next.col] = 2;continue;}path.pop();//如果四面都不通的话 则将该坐标pop出去 ,,,以上一个位置再继续判断别的方向}return false;}
之前我们说栈的时候 ,,,说过能用栈解决的问题 也可以使用 递归来解决。。。
下面我们来说说这样怎么来写
我们可以讲 当前的位置都看成是入口 , , , ,然后往下一直递归
//递归算法bool IsHasPath(int ** maze, size_t N, stack<Pos> &path, Pos entry){path.push(entry);//将每次进行递归的入口压栈maze[entry.row][entry.col] = 2;Pos cur = entry;Pos next;if (cur.row == N - 1)//判断是否为出口 return true;//判断四面是否可tong//上next = cur;next.row -= 1;if (checkPos(maze, next, N)){if(IsHasPath(maze, N, path, next))//如跳出递归 果找出出口 则层层回去return true;}//右next = cur;next.col += 1;if (checkPos(maze, next, N)){if (IsHasPath(maze, N, path, next))//如跳出递归 果找出出口 则层层回去return true;}//下next = cur;next.row += 1;if (checkPos(maze, next, N)){if (IsHasPath(maze, N, path, next))//如跳出递归 果找出出口 则层层回去return true;}//左next = cur;if (checkPos(maze, next, N)){if (IsHasPath(maze, N, path, next))//如跳出递归 果找出出口 则层层回去return true;}path.pop();return false;}
之后我们要说说怎么这样求最短路径
求最短路径就是要将所有的通路都要遍历一遍所以 我建议使用递归的方法
//递归求最短路径int MinPath(int ** maze, size_t N, stack<Pos> &path, Pos entry,stack<Pos> &min){path.push(entry);maze[entry.row][entry.col] = 2;Pos cur = entry;Pos next;if (cur.row == N - 1){if (path.size() < min.size() || min.size() == 0)//如果这条路比最短路径的长度小 则赋值给最短路径存放的栈min = path;}//判断四面是否可tong//上next = cur;next.row -= 1;if (checkPos(maze, next, N)){MinPath(maze, N, path, next,min);}//右next = cur;next.col += 1;if (checkPos(maze, next, N)){MinPath(maze, N, path, next, min);}//下next = cur;next.row += 1;if (checkPos(maze, next, N)){MinPath(maze, N, path, next, min);}//左next = cur;next.col -= 1;if (checkPos(maze, next, N)){MinPath(maze, N, path, next, min);}maze[path.top().row][path.top().col] = 0;//将pop出来的位置的值再改回来 ,,,因为也有可能别的通路也走这条路 path.pop();if (min.size())return min.size();elsereturn -1;}
0 0
- 迷宫求解问题
- 递归求解迷宫问题
- 迷宫问题求解
- 迷宫问题递归求解
- 迷宫问题求解
- 迷宫求解问题
- BFS求解迷宫问题
- 栈求解迷宫问题
- 栈求解迷宫问题
- 迷宫问题的求解
- 迷宫问题求解
- 迷宫求解问题
- 迷宫问题求解
- DFS求解迷宫问题
- 回溯求解-迷宫问题
- 迷宫求解问题
- 递归法求解迷宫问题
- 迷宫问题的递归求解
- nyist-部分和问题
- 多线程——GCD(串行队列)
- SyntaxError: Non-UTF-8 code starting with '\xb2in file.
- 数据库存储过程和触发器
- nginx反向代理配置
- 迷宫问题求解
- 解决输入法无法打字 ,ime禁用问题
- RabbitMQ从入门到精通----环境安装
- PathMeasure
- android的Notification折叠
- python manage.py syncdb Unknown command: 'syncdb'问题解决方法
- MySql- Access denied for user 'mysql用户名'@'主机或IP' (using password: YES)'
- List集合实现自定义排序
- 如何在CentOS 7上安装MySQL