前言:
之前一直不理解打印多条路径的时候在回溯时要把已访问的点设为未访问,还有路径打印的具体过程。
一、题目描述
问题:给出一个n*n的迷宫,起点为(0,0),终点为(n-1,n-1).可以向上、下、左、右四个方向走.
任务:1.判断是否有可行路径
2.如果有可行路径,输出所有的可行路径.
二、解题要点:
1.找到符合要求的邻接点,对其相应操作
由题意可知:符合要求的邻接点位于当前点的上下左右四个方向,并且邻接点的位置为0,并且不能出界,并且没有被访问过,即:
if(0<=nx && nx<n && 0<=ny && ny<m && maze[nx][ny]==0 && vis[nx][ny]==0)
对邻接点进行相应操作:将访问过的点置为已访问,并且由于要打印路径,将其放入栈内。
2.找到解或者走不下去的时候进行相应操作:
找到解的情况:某个点走到的位置是终点位置,此时要打印路径。并且由于本题是找到多条路径,所以在找到一条路径后,我们要利用return语句进行回溯操作,继续找其它路径。
走不下去的情况:如果相邻点出界,,我们就利用return语句回溯到上一个点。(为什么需要写这个,后面的if语句不是已经限制了不能出界吗,表面根本没有去试探这个点的可能性,所以我感觉不需要回溯。如果说if语句中没有写这个,那我们可以进行回溯操作。
3.为什么回溯的时候要将已访问的点设为未访问,这样不会以后走到重复的路上吗?
回溯设为未访问的原因:恢复现场。
比如拿终点来说,我们走过后将其设为已访问,但是由于是打印多条路径,设为已访问的话意味着即使有其它路径可以走到终点,那再也不会走到了。
对于
以后是否会走到重复的路上的?
会,因为有可能某个点是多个点的邻接点。
如何去解释死循环问题,我还没有想好
不会进行死循环,因为用一个for语句控制的,如果说该点是正确路径或者不是正确路径,我们都会进行回退,此时for循环的i+1了,不会再在此点把刚才那个不对的邻