声明:仅为本人学习过程中的一些不成熟想法
0.前情提要
迷宫问题指通过设计算法,从一个点在特定环境移动到另一个点.
目前的解决算法:深度搜索算法:从一个点出发,选择一个方向,直到没有方向可以前进,则退回到上一个有方向前进的点,从另一个方向继续搜索.
1.问题解决路径
1.1 解决问题思路
对于该问题,
Ⅰ 首先想到的思路是:
①建立一个方向搜索函数,按照东南西北的方向搜索可以前进的方向,一旦有一个方向可以前进,给出前进坐标,并退出函数,否则返回-1(表示无看前进方向).
②循环方向搜索,直到当前坐标点为结束坐标点(终止条件)
③利用栈存储已经进过的坐标点
Ⅰ.Ⅱ 遇到的问题:
①未考虑到:先前移动的方向,导致方向搜索函数在某些条件下会出现倒退的情况,造成了倒退-前进的死循环.
②基础知识的错误,对列表索引使用了元组,但一直未曾发现(警惕此情况再次发生)
Ⅱ 修改后的思路:
Ⅰ.Ⅰ 修改的方向:
①添加一个上一点到目前坐标点的前进方向的标志位pre_direction,并用标志位修改方向搜索函数,具体指修改每个方向搜索函数的if条件语句,在其''pre_direction!=各方向代表数''
各方向代表数按此规律表示:东:1,南:2,西:3,北:4
①.①发现的问题:按此规律表示,没有发现简单的计算式可以成功计算出相应标志位.
①.②对应修改思路:修改规律为:东:1.南:2,西:-1,北:-2
Ⅰ.Ⅱ 遇到的问题
①在按照公式:pre_direction=2*(当前位置的行坐标-先前位置的行坐标)+当前位置的列坐标-先前位置的列坐标,计算后运行代码,仍然出现了后退-前进的逻辑死循环,情况未有改变.
Ⅰ.Ⅱ.Ⅰ 修改的方向
①虽然添加方向标志位并没有改变问题,但添加方向标志位的思路没有问题,所有考虑将先前的pre_direction更换到逻辑上代表当前位置不能前进方向no_direction(即上一个位置点到当前位置点的反方向),同时更新公式为:
no_direction=2*(先前位置的行坐标-当前位置的行坐标)+先前位置的列坐标-当前位置的列坐标
Ⅰ.Ⅲ 遇到的问题
①.将方向标志位改为no_direction后解决了后退-前进的死循环问题,但运行程序后,发现在某些特定的迷宫环境会陷入下列死循环:
向上-向左-向下-向前-向上-...
这样的迷宫环境必有一个大缺口,
②.应对①出现的问题,说明缺乏长期记忆函数,即可以长期记忆移动路径的函数(尚未找到实现路径)
③对②不好实现,换一种思路,在方向函数里面加上条件判断代码,判段一个点在不在堆栈内.
2.其他解答
2.1 解答思路
①仍然将经过的数据存放在堆栈中,每次取堆栈末尾的数据作为当前点,不能前进,pop出堆栈.
②将方向判别函数使用lambda函数实现,并将下一个点对应的值改为2,这样可以表示该点已经经过,不能再次经过.