上篇文章我们讨论了,迷宫问题的普通求解问题,这篇文章我们继续深入,求迷宫的最短路径.
要想求迷宫的最短路径,一个很简单的方法就是再设置一个Min栈,用来放最短路径,每找到一个出口,就将path栈与Min栈进行比较,如果path栈更小,则赋值给Min.
而在上篇文章中,我们将走过的路径做了标记,每走一个坐标,就把那个坐标置为3,直至找到出口.
因此如果用这种标记方式,显然是会出现问题的.
所以我们需要换种标记方式!
最终....我决定,使出口的值为2,每走一步使当前位置标记变为是上一位置标记再加1.
在这种情况下,我们检测当前位置是否可以通过的函数(CheckIsAccess(int*,sz,Pos))就需要做一些微小的调整....
检测通路函数
/*
*函数功能:检测当前路径是否可以通过(最短路径)
*参数说明:
* Maze:迷宫数组
* sz:迷宫大小
* cur:当前位置坐标
* next:下一位置坐标
* 返回值:可以通过返回true,不能通过返回false
*/
bool CheckIsAccess(int *Maze,size_t sz,Pos cur,Pos next){
//如果下一步路径越界
if((next.x<0||next.x>sz)||
(next.y<0||next.y>sz)){
return false;
}
//下一坐标为0
if(0 == (Maze[next.x*sz+next.y])){
return true;
}
//下一坐标为之前走过的路
if((Maze[next.x*sz+next.y]>Maze[cur.x*sz+cur.y]+1)){
return true;
}
return false;
}
寻找最短路径函数
/*函数功能:求迷宫最短路径
*参数说明:
* Maze:迷宫数组
* sz:迷宫大小
* entry:迷宫入口
* path:走过的路径
* Min:最短路径
* 返回值:可以通过返回true,不能通过返回false
*/
//求最短路径
void GetMazeMinPath(int *Maze,size_t sz,Pos &entry,stack& path,stack &Min){
path.push(entry);
Pos cur = entry;
Pos next = cur;
//找到出口
if(sz-1 == cur.y){
//第一次赋值给Min 或者path路径比Min短
if(Min.empty()||path.size()
Min = path;
}
path.pop();
return ;
}
//右
next.x += 1;
if(CheckIsAccess(Maze,sz,cur,next)){
Maze[next.x*sz+next.y] = Maze[cur.x*sz+cur.y]+1;
GetMazeMinPath(Maze,sz,next,path,Min);
}
//左
next = cur;
next.x -= 1;
if(CheckIsAccess(Maze,sz,cur,next)){
Maze[next.x*sz+next.y] = Maze[cur.