今天我参考严蔚敏的《数据结构》第3章 栈和队列的3.2.4上的问题描述、解决思路和伪代码把迷宫求解的问题自己实现了一遍,感觉超开心的哇~~嘻嘻,贴出来,以供以后翻阅。
解决过程中的几点思考:
1.对于position NextPos(position cur, int dir)函数,它的目的不是提供一个可行的下一个位置,而是提供一个下一个要考虑的位置,至于可不可行,暂时不用考虑,可不可行的判断实际上是由MazePath函数里的if (mazeStatus[curPos.x][curPos.y]==1)完成的。所以NextPos函数不用写成下面这样
position nextPos = cur;
int temp;
if (dir == 1)
{
temp = mazeStatus[cur.x+1][cur.y];
if (temp==0||temp==1)
{
nextPos.x++;
}
else
{
dir = 2;
}
}
if (dir == 2)
{
temp = mazeStatus[cur.x][cur.y+1];
if (temp==0||temp==1)
{
nextPos.y++;
}
else
{
dir = 3;
}
}
if (dir==3)
{
temp = mazeStatus[cur.x-1][cur.y];
if (temp == 0 || temp == 1)
{
nextPos.x--;
}
else
{
dir = 4;
}
}
if (dir==4)
{
nextPos.y--;
}
2.关于
中的while为什么不能改成if,是因为我们在每一次pop完之后都要对这个节点进行判断,判断是否已经对其周边的四个位置已经考虑过了,如果周围四个节点都已经考虑过,则废弃当前位置,即mazeStatus[t.pos.x][t.pos.y]=3;如果在这里我们将while改成if,对最终形成的路线不会有影响,但是可能有个别迷宫的最终位置状态有误(0表示未访问过且“此路不通”;1表示位访问过且“此路通”;2表示访问过,且属于线路;3表示访问过,但是不可行)。
正确的结果图:
如果将上述的while改成if的结果图,红圈的地方表示状态有误: