迷宫:根据迷宫中通路的数量和路的特点,可将迷宫分为三类
- 简单迷宫
- 多通路迷宫(通路间不带环)
- 多通路迷宫(通路间带环)
不管是哪种迷宫,通常我们要解决的问题是找出通路,通常还得找到最短的那条通路,这里我们先说如何找到一条通路,等这个问题解决之后再说说如何找到最短的那条通路
找迷宫通路
找迷宫通路需要使用回溯法,找迷宫通路是对回溯法的一个很好的应用,实现回溯的过程用到了数据结构—栈
回溯法:对一个包括有很多个结点,每个结点有若干个搜索分支的问题,把原问题分解为若干个子问题求解的算法;当搜索到某个结点发现无法再继续搜索下去时,就让搜索过程回溯(回退)到该节点的前一个结点,继续搜索该节点外的其他尚未搜索的分支;如果发现该结点无法再搜索下去,就让搜索过程回溯到这个结点的前一结点继续这样的搜索过程;这样的搜索过程一直进行到搜索到问题的解或者搜索完 了全部可搜索分支没有解存在为止。
问题分析:
代码实现:
void InitMaze(Maze* m, int map[ROW][COL]) //迷宫的初始化
{
for (int i = 0;i< ROW ;++i)
{
for (int j = 0; j < COL; ++j)
{
m->map[i][j] = map[i][j];
}
}
}
void PrintMaze(Maze* m) //打印迷宫
{
for (int i = 0; i < ROW; ++i)
{
for (int j = 0; j < COL; ++j)
{
printf("%d ",m->map[i][j]);
}
printf("\n");
}
printf("\n");
}
int IsValidEnter(Maze* m, Position cur) //判断是否是有效的入口
{
assert(m);
if ((cur._x == 0 || cur._x == ROW - 1)
|| (cur._y == 0 || cur._y == COL - 1)
&& (m->map[cur._x][cur._y] == 1))
return 1;
else
return 0;
}
int IsNextPass(Maze* m,Position cur, Position next) //判断当前节点的下一个节点能不能走通
{
assert(m);
//这里有必要判断一下他给的节点在不在迷宫里面
if (((next._x >= 0 && next._x < ROW) || (next._y >= 0 && next._y < COL))
&&(m->map[next._x][next._y] == 1))
return 1;
else
return 0;
}
int IsExitPosition(Maze* m, Position cur,Position enter) //判断当前节点是不是迷宫的出口
{
assert(m);
//这里首先得保证该节点不是入口点,其次只要它处在迷宫的边界即可
if ((cur._x != enter._x || cur._y !=