#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为NULL
for (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; //若可以走,将该位置置为2
path.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上浏览博客,觉得其他的博主的代码注释写的都很好,使代码有很强的可读性,今天写这篇博客翻出之前写的代码,这个迷宫代码行数也比较少,逻辑也不是很难,看起来不是很难,但是以后要是真的要有很难的很长的代码,不注释的话,自己都很难看懂,更别说给小伙伴们看了。写注释很重要,写注释很重要,写注释很重要!!!重要的话说三遍
欢迎大家来提出意见,共同进步!