About Maze Problem

         

前提说明:能通过为1,不能通过为0,如果通过成功把这个位置设定为9,不能通过的位置设置为2

 

 

      处理迷宫问题主要是用到栈的定义,程序运行好就是原始程序一段一段的放入栈中,迷宫问题就是把每一步都放入到栈中直到程序结束,或者运行失败。

      最先分析的是每一步如何计算,如何记录,如何进行下一步计算。关于每一步问题,可以把这个问题看成是二维问题,X,Y坐标来确定,如此就出现第一个结构体position_coordinates(位置坐标),然后就出现第二个结构体来记录这个坐标、第几步和方向。这里声明一下东南西北对应0123,无论到哪都先考虑东的方向。如此第二个机构体Read_position(记录位置),最后考虑入栈问题,就是路径问题。其实路径就是一个总的记录位置的汇总,再加上入栈的记录。即Maze_Path。(理解性错误,是应该把二维问题化解为一维问题来解决)。

      数据说完,就要考虑整个问题主要涉及的函数。首先第一个函数一定是这个位置能不能通过的问题bool valid_position(有效位置),考虑到需要打印路径,所以可以通过的总路径需要一个不同的数值,FootPrint(足印)呵呵,就是从新赋值这个位置。当然考虑到可能你通过段后,不能寻找到最后的出口,然后你就必须往回退。如此你的足印就不能是可通过的路径必须改为另一个值,这个值一旦确定就不会再次通过它去目的地,因为前期通过它并没有通往目的地,如此后面再通过它也不能到达目的地。Invalid_position(无效位置),再有就是方向问题FootDirection(足迹方向),下一个就是程序的核心走迷宫Find_Maze_Path,这个函数需要说明一下他的原理。

      Find_Maze_Path,它需要知道起始位置和最终位置,并且引入一个Maze_Path,设置迷宫路径栈位置Top-1,走的步数起始位置为1,定义一个位置坐标对象和一个记录位置对象。开始进入循环如果此位置可通过则先留下足迹,记录步数,纠正方向,把当前位置坐标对象赋值给记录位置对象,栈的位置加一,Maze_Path记录一步。然后调用足迹方向,步数加一。

       如果没有通过,首先查看栈的位置,然后后退一步,考虑到逻辑问题,先把消除路径放在前面,即方向等于3并且栈不为-1则表面这个位置不能通过,需要出栈,从新选定方向。即调用无效位置,然后后退一步。接着跳出循环接着看按照方向依次查询。

       最后涉及到的就是打印路径,这里就要说为什么是引入一个Maze_Path,没有它就不能打印了,如此就可以按照循环来依次打印出它走的路径。

       最重要的一个函数没写,没有它就是死循环,不能得到最终是可以通过,还是不能通过Maze的标志,Reach_Home

       如果你想看看一看他们到底是这么走的就可以打印全部的路径看一看他是如何寻找路径的,在哪里通过,哪里没有通过。

         主要涉及的几个思想一、就是把问题抽象化,就是把现实问题转变成逻辑问题,再转变成数据问题。二、思路问题,熟练回溯法编程。三、对问题的解析,转变问题为类或者结构体,就是抽象化的再次细化。简单来说就是都用什么数据来描述这个问题。四、对问题的细化,就是敏捷开发中的单一职责原则,每一个函数都只关心他自己的实现方法。

你可能感兴趣的:(回溯算法迷宫问题C++)