假如有以下带环的多出口迷宫地图:
这里的思路与之前迷宫求解多出口求最短路径相似,不同的是,这里需要多传一个参数pre,保存当前要落脚的点的上一次走到这个点的大小
1.判定当前点是否能落脚
2.如果能落脚,进行标记,同时将当前点插入到cur_path栈中,更新pre
3.判断是否是出口
a)如果是出口,就比较cur_path与short_path的大小,如果cur_path小就代替short_path
b)如果不是出口,以当前点为准则,采用递归式顺时针继续探测四周
4.如果四周都探测过了,进行回溯
解释:
这里的判断是否能落脚的规则变了:
1.判断当前点是否在地图上,相当于合法判定
2.判定当前点是否是墙
3.如果当前点是1,则可以直接落脚
4.如果当前点已经被标记过了,就比较当前点与pre的大小,当当前点大于pre+1时,就可以落脚,否则不能落脚(结合如下代码看);
这里的标记规则也变了:
首先,入口点的pre规定为(-1,-1),当pre为(-1,-1)时,就标记入口点为2,此后标记规则为,当前落脚点为pre+1;
具体代码实现如下:
void MazeInit3(Maze* maze){
if(maze == NULL){
return;
}
int map[MAX_ROW][MAX_COL] = {
{
0,1,0,0,0,0},
{
0,1,1,1,0,0},
{
0,1,0,1,1,1},
{
1,1,1,1,0