接着上一个迷宫算法,我们进一步求解----寻找迷宫中从起点到结束点的步数:
如下图所示的矩阵,可以看出一共有4条路径从入口到出口:
1. 紫色背景的路径
2. 绿色背景的路径
3. 绿色背景和紫色背景交互产生的2条路径。
分析:
2---- 墙
1---- 已经走过的路径
0---- 没有走过的路径
代码部分
#include <iostream>
using namespace std;
void visit(int, int);
int maze[9][9] =
{{2, 2, 2, 2, 2, 2, 2, 2, 2},
{2, 0, 0, 0, 0, 0, 0, 0, 2},
{2, 0, 2, 2,0, 2, 2, 0,2},
{2, 0, 2,0, 0, 2, 0, 0, 2},
{2, 0, 2,0, 2, 0, 2, 0, 2},
{2, 0, 0, 0, 0, 0, 2, 0, 2},{2, 2, 0, 2, 2,0, 2, 2, 2},
{2, 0, 0, 0, 0, 0, 0, 0, 2},
{2, 2, 2, 2, 2, 2, 2, 2, 2}};int startI = 1, startJ = 1; // 入口
int endI = 7, endJ = 7; // 出口
int main(void) {
int i, j;
cout << "display the maze" << endl;
//打印开始的迷宫数组
{
for(j = 0; j < 9; j++)
{
if(maze[i][j] == 2) //如果是墙的话,打印‘#’
{
cout << "#";
}
else //如果是‘0’,就打印空格
{
cout<<" ";
}
}
cout<<endl;
}
visit(startI, startJ);
return 0;
}
void visit(int i, int j) {
int m, n;
maze[i][j] = 1;
if(i == endI && j == endJ)
{
cout << "display the maze" << endl;
int step = 0;
for(m = 0; m < 9; m++)
{
for(n = 0; n < 9; n++){
if(maze[m][n] == 2)
{
cout << "#";
}
else if(maze[m][n] == 1)
{
++step; //这里是所有走过的路径都自加1,当然也包括了起点
cout << "*";
}
else
{
cout<<" ";
}
}
cout<<endl;
}
cout << "total step for this maze is: " << step<<endl;
}
if(maze[i][j+1] == 0) visit(i, j+1);
if(maze[i+1][j] == 0) visit(i+1, j);
if(maze[i][j-1] == 0) visit(i, j-1);
if(maze[i-1][j] == 0) visit(i-1, j);
maze[i][j] = 0; //回调结束以后,把走过的路径再赋值为0,为剩下的通路提供初始条件
}
运行的结果如下: