老鼠走迷宫是递回求解的基本题型,我们在二维阵列中使用2表示迷宫墙壁,使用1来表示老鼠的行走路径,试以程式求出由入口至出口的路径。
老鼠的走法有上、左、下、右四个方向,在每前进一格之后就选一个方向前进,无法前进时退回选择下一个可前进方向,如此在阵列中依序测试四个方向,直到走到出口为止,这是递回的基本题,请直接看程式应就可以理解。
//
//找到迷宫的一种走法
//
#include<iostream>
using namespace std;
//迷宫数组
int maze[7][7]=
{
{2,2,2,2,2,2,2},
{2,0,0,2,0,0,2},
{2,0,2,0,0,0,2},
{2,0,2,0,2,0,2},
{2,0,0,0,2,0,2},
{2,0,0,0,2,0,2},
{2,2,2,2,2,2,2}
};
bool success = false;//标记是否找到迷宫终点
int startI = 1, startJ = 1;//起点
int endI = 5, endJ = 5;//终点
bool Visit(int, int);
void Show();
int main()
{
cout << "起初的迷宫:\n";
Show();
Visit(startI, startJ);
cout << "迷宫的走法:\n";
Show();
return 0;
}
bool Visit(int i, int j)
{
maze[i][j] = 1;//足迹
if (i == endI&&j == endJ)
{
success = true;
return success;
}
if (success!=true && maze[i][j + 1] ==0) Visit(i, j + 1);
if (success!=true && maze[i + 1][j] ==0) Visit(i + 1, j);
if (success!=true && maze[i][j - 1] ==0) Visit(i, j - 1);
if (success!=true && maze[i - 1][j] ==0) Visit(i - 1, j);
if (success != true)
maze[i][j] = 0;
return success;
}
void Show()
{
for (int i = 0; i < 7; i++)
{
for (int j = 0; j < 7; j++)
{
cout << maze[i][j];
cout << ((j == 6) ? "\n" : " ");
}
}
}
//
//找到迷宫的所有走法
//
#include<iostream>
using namespace std;
//迷宫数组
int maze[7][7] =
{
{ 2,2,2,2,2,2,2 },
{ 2,0,0,2,0,0,2 },
{ 2,0,2,0,0,0,2 },
{ 2,0,2,0,2,0,2 },
{ 2,0,0,0,2,0,2 },
{ 2,0,0,0,2,0,2 },
{ 2,2,2,2,2,2,2 }
};
int startI = 1, startJ = 1;//起点
int endI = 5, endJ = 5;//终点
void Visit(int, int);
void Show();
int main()
{
Visit(startI, startJ);
return 0;
}
void Visit(int i,int j)
{
maze[i][j] = 1;
if (i == endI&&j == endJ)
Show();
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;
}
void Show()
{
static int count = 0;
count++;
cout << "第" << count << "个走法\n";
for (int i = 0; i < 7; i++)
{
for (int j = 0; j < 7; j++)
{
cout << maze[i][j];
cout << ((j == 6) ? "\n" : " ");
}
}
cout << endl;
}