您的位置:首页 > 其它

用栈寻找迷宫的最短路径

2016-06-05 17:35 295 查看
#define _CRT_SECURE_NO_WARNINGS 1#include <iostream>using namespace std;#include <assert.h>#include <stack>struct Pos{size_t x;size_t y;};stack<Pos> MinPath;void InitMaze(int *maze, size_t size){assert(maze);FILE* fout = fopen("E:\\数据结构\\5_17_2016\\Maze.txt", "r");//在Maze.txt中写了一个迷宫的布局assert(fout);  //断言fout,若读取Maze.txt失败,fout为NULLfor (size_t i = 0; i < size; i++){for (size_t j = 0; j < size;){char ch = getc(fout);      //一个字符一个字符的获取fout读取的内容if (ch == '0' || ch == '1') //是‘0’或 ‘1’时读入maze[]数组中{maze[i*size+j] = ch - '0';//将ch从字符转为数字j++;}}}}void PrintMaze(int* maze, size_t size)//打印{for (size_t i = 0; i < size; i++){for (size_t j = 0; j < size; j++){cout << maze[i*size + j] << " ";}cout << endl;}}stack<Pos> GetMorePath(int* maze, size_t size, Pos entry, stack<Pos> path)//获取该迷宫的最优路径,maze是迷宫,size是迷宫的长宽(正方形),entry 迷宫的入口点, path 一个栈用来存放路径{                                                                          //此处应注意二维数组的传参和使用assert(maze); //断言path.push(entry); //将迷宫入口入栈maze[entry.x *size + entry.y] = 2; //此处将二维数组当一维数组来访问 maze[i][j]  =>  maze[i*size+j]Pos cur = {};                      //保存栈顶元素while (path.top().x != size - 1 && path.top().y != size - 1 && path.top().x != 0){cur = path.top();if (maze[(cur.x - 1)*size + cur.y] == 0 && (cur.x - 1) >= 0)//上;该位置为0,且该位置存在{cur.x = cur.x - 1;cur.y = cur.y;maze[cur.x *size + cur.y] = 2;  //若可以走,将该位置置为2path.push(cur);continue;}else if (maze[(cur.x + 1)*size + cur.y] == 0 && (cur.x + 1) < size)//下;该位置为0,且该位置存在{cur.x = cur.x + 1;cur.y = cur.y;maze[cur.x *size + cur.y] = 2;path.push(cur);continue;}else if (maze[cur.x*size + cur.y - 1] == 0 && (cur.y - 1) >= 0)//左;该位置为0,且该位置存在{cur.x = cur.x;cur.y = cur.y - 1;maze[cur.x*size + cur.y] = 2;path.push(cur);continue;}else if (maze[cur.x*size + (cur.y) + 1] == 0 && (cur.y + 1) < size)//右;该位置为0,且该位置存在{cur.x = cur.x;cur.y = cur.y + 1;maze[cur.x*size + cur.y] = 2;path.push(cur);continue;}else{if (path.top().x == entry.x && path.top().y == entry.y)  //路径栈path中只有一个元素entry,则entry出栈;且跳出{path.pop();break;}else{path.pop(); //已经找到出口}}}/*cout << endl;PrintMaze(maze, 10);*/while (!path.empty() && (MinPath.size() > path.size() || MinPath.empty()))  //当栈path 不为空;且(最短路径MinPath 的size 大于path 的size ){while (!path.empty()){MinPath.push(path.top());//交换MinPath和path的内容path.pop();}/*MinPath = path;*///不可以直接赋值,path不会清空InitMaze(maze, 10);maze[cur.x*size + cur.y] = 6;//将已经走过的可以走通的路的终点置为6;保证下次不会再走这条路GetMorePath(maze, size, entry, path);//递归,再寻找其他的路}return MinPath;}void TestMzae(){int maze[10][10];//定义一个10 X 10的数组InitMaze((int*)maze, 10);//初始化数组PrintMaze((int*)maze, 10);Pos entry = { 2, 0 };stack<Pos> path;path = GetMorePath((int*)maze, 10, entry, path);cout << endl;PrintMaze((int*)maze, 10);}int main(){TestMzae();system("pause");return 0;}
前一段时间实现的一个寻找一个迷宫中最短路径的代码,主要是使用栈来记录路径;这次写代码的最大感触:虽然自己平时也做一些写代码的练习,但并没有很好养成写注释的这个习惯,这几天在CSDN上浏览博客,觉得其他的博主的代码注释写的都很好,使代码有很强的可读性,今天写这篇博客翻出之前写的代码,这个迷宫代码行数也比较少,逻辑也不是很难,看起来不是很难,但是以后要是真的要有很难的很长的代码,不注释的话,自己都很难看懂,更别说给小伙伴们看了。写注释很重要,写注释很重要,写注释很重要!!!重要的话说三遍欢迎大家来提出意见,共同进步!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: