前言
本代码为清华大学出版社的数据结构实用教程(第二版)例4-7
迷宫问题一直是数据结构初学者避免不了练习题,博主在此提供迷宫的基本思路,以及完整代码(C++),欢迎大家借鉴使用。
基本思路
迷宫是一个矩形区域,有一个出口和入口,迷宫内部包含不能穿越的墙壁和障碍物。本程序用矩阵来描述迷宫。入口是(0, 0), 出口是(m,n),现在需要在迷宫中选找一条路径,穿过迷宫。位置Aij=1表示有障碍,0表示无障碍。
思路:
首先,利用数组定义四个方向(东南西北)进行搜索寻找可行方向,被走过的位置设置为1,也就是走过的地方就不再走(防止跳入循环),然后在可行的方向移动到下一个位置,将前一个位置坐标入栈(保存路径),且将此位置设置为1。
其次,如果在某个位置没有找到可行的方向,则将当前这个位置设置为1(也就是不再走这个位置),从栈顶弹出一个坐标,作为当前坐标(相当于这条路不通,要往回走),继续搜索其他的方向是否可行。
最后进行递归,直到找到路径即可。
代码整体思路为:
(1)输入迷宫
(2)寻找路径
(3)输出路径
以下是部分代码
int main()
{
//生成随机迷宫矩阵
//四周为1
for (int i = 0; i < m + 2; i++)
{
maze[i][0] = 1;
maze[i][n + 1] = 1;
}
for (int j = 0; j < n + 2; j++)
{
maze[0][j] = 1;
maze[m + 1][j] = 1;
}
//内部随机生成0和1
for (int i = 1; i < m + 1; i++)
{
for (int j = 1; j < n + 1; j++)
{
maze[i][j] = num();
}
}
//设置入口和出口
maze[1][1] = 0;
maze[m][n] = 0;
for (int i = 0; i < m + 2; i++)
{
for (int j = 0; j < n + 2; j++)
{
cout << maze[i][j] << " ";
}
cout << endl;
}
for (int i = 0; i < m + 2; i++)
for (int j = 0; j < n + 2; j++)
mark[i][j] = 0;
//入口点对应访问标记为1
mark[1][1] = 1;
//调用函数递归求解
if (SeekPath(1, 1))
cout << "(" << 1 << "," << 1 << ")" << endl;
else cout << "此迷宫无通路!" << endl;
return 0;
}
程序运行结果
代码获取途径
如需完整代码,请点击以下链接进行购买:https://download.youkuaiyun.com/download/m0_54688810/19746939