假如有如下一个迷宫地图:
与迷宫求解1中,简单迷宫找路径思路相似,不同的是:这里需要定义两个栈cur_path和short_path,来存放当前路径长度,与最短路径长度,每找到一条路径就与最短路径进行比较,如果比最短路径短,就用当前路径cur_path代替最短路径short_path;
1.判定是否能落脚;
2.如果能落脚进行标记,同时将当前点插入到cur_path顺序栈中;
3.判断当前点是否是出口
a)如果是出口,比较当前cur_path与最短路径short_path的长度
b)如果不是出口,就递归的以顺时针方向继续探测四周
4.如果四个点都探测过了,就进行回溯
解析:
能否落脚的判定规则和标记规则与迷宫求解1中的一样,代码请参考迷宫求解1;
具体代码实现如下:
void MazeInit2(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,0,0,0},
{0,0,1,0,0,0},
{0,0,1,0,0,0},
};
size_t i = 0;
for(;i<MAX_ROW;i++){
size_t j = 0;
for(;j<MAX_COL;j++){
maze->map[i][j] = map[i][j];
}
}
return;
}
void _GetShortPath(Maze* maze,Point cur,Point entry,SeqStack* cur_path,SeqStack* short_path){
if(maze == NULL){
return;
}
//1.判断当前点是否能落脚
if(!CanStay(maze,cur)){
return;
}
//2.如果能落脚,就对当前点进行标记,同时把当前点插入到cur_path
Mark(maze,cur);
SeqStackPush(cur_path,cur);
//3.判断当前点是否是出口
if(IsEixt(maze,cur,entry)){
//a)如果是出口,说明找到了一条路径,拿当前路径与最短路径进行比较
//如果当前路径比最短路径短,或者最短路径为空
//就用当前路径代替最短路径
printf("找到一条路径\n");
if(cur_path->size < short_path->size || short_path->size == 0){
printf("找到一条较短路径\n");
SeqStackAssgin(cur_path,short_path);
}
//b)如果当前路径没有short_path短,就继续在找其他路径(进行回溯)
//回溯之前要把cur_path栈顶元素出栈
SeqStackPop(cur_path);
return;
}
//4.如果当前点不是出口,按照顺时针方向继续探测相邻的四个方向
Point up = cur;
up.row -= 1;
_GetShortPath(maze,up,entry,cur_path,short_path);
Point right = cur;
right.col += 1;
_GetShortPath(maze,right,entry,cur_path,short_path);
Point down = cur;
down.row += 1;
_GetShortPath(maze,down,entry,cur_path,short_path);
Point left = cur;
left.col -= 1;
_GetShortPath(maze,left,entry,cur_path,short_path);
//5.如果四个方向都探测过了,就可以进行出栈(指当前函数栈帧结束,
//同时cur_path也要进行出栈),回溯到上一个点
SeqStackPop(cur_path);
return;
}
//找到所有路径然后从所有路径中筛选出最短的一条(递归 )
void GetShortPath(Maze* maze,Point entry){
if(maze == NULL){
return;
}
//就像从一个数组中查找最小元素一样,定义一个最短路径short_path,保存最短路径
SeqStack cur_path;//保存当前路径
SeqStack short_path;//保存最短路径
SeqStackInit(&cur_path);
SeqStackInit(&short_path);
_GetShortPath(maze,entry,entry,&cur_path,&short_path);
SeqStackDebugPrint(&short_path,"最短路径");
}