今天讲的是一个关于迷宫的面试题,首先咱们先看一下他的简单版本,模型如下图:
利用递归把问题简单化,找入口到出口的问题可以转化为从入口四周的合法的点到出口的问题,一旦找到就结束整个递归,在找的同时,把能走的路压到一个栈里面,然后探测四周,如果四周都不能走就退栈,如果某一个方向能走,进行压栈,然后转尔探测新的坐标的四周,代码如下:
#include<iostream>
#include<stack>
using namespace std;
struct Set
{
Set(int x, int y) :_x(x), _y(y)
{}
int _x;
int _y;
};
//找一条路
template<int MAX>
class Mez
{
public:
//初始化迷宫
Mez(int arr[][MAX])
{
maparr = new int[MAX][MAX];
for (int i = 0; i < MAX; i++)
{
for (int j = 0; j < MAX; j++)
{
maparr[i][j] = arr[i][j];
}
}
}
~Mez()
{
delete[] maparr;
}
void display()
{
for (int i = 0; i < MAX; i++)
{
for (int j = 0; j < MAX; j++)
{
printf("%4d", maparr[i][j]);
}
cout << endl << endl;
}
cout << endl;
}
bool movement(Set&set, stack<Set>& Route)
{
if (Islegalset(set))
{
maparr[set._x][set._y] = 2;
Route.push(set);
if (Iswill(set))
{
return true;
}
//如果他的下一个位置为0则可以走。
//朝上走
if (maparr[set._x - 1][set._y] == 0)
{
if(movement(S