随机给定一个必有通路的迷宫,其中0表示通路,1表示受阻,规定向下是X轴,向右是Y轴求从入口到出口的最短路径。
基本思路为从迷宫入口(1,1)出发,向四周搜索,记下所有一次能通达的坐标p11,p12,…p1k,然后从p11,p12,…p1k出发,向四周搜索,标记搜索过的点……直至达到出口点(m,n),然后从出口点沿搜索路径回溯直至入口。
我们可以使用队列的数据结构来解决这个问题。将所有方向用dir数组装起来,将顶点加入队列,进入循环,循环出口:为x,y坐标等于设置的出口坐标,每次将各个方位的坐标加入队列中并做上标记(防止重复走,减少计算量),最先到达循环出口的即为最小路径。假定走迷宫按照下右上左的顺序走动。将起点放入队列,从队列中拿出队列首部数据进行第一次循环,具体及起点向下能走吗,如果能,将起点向下的这一位置放入队列尾部,如果不能,起点能向右走吗,如果能…然后将能走的位置记为1,及从起点到该位置最短路径为1,进行完第一次循环之后,假设队列现在存放的依次是起点下方,起点右方,然后进行第二次循环,从队列中拿出首部数据(及起点下方),依次判断能否向下右上左移动,此时我们需要一个判断条件,来避免反复走到同一位置(例如起点向下走后,又向上走回到了起点,我们不需要这样步数为2的路径),解决方法是,创立一个和迷宫同样大小或者远远大于迷宫大小的二维数组H,然后将数组每个位置初始为一个不可能的路径步数,例如10000或者-1等等,假设初始为10000,那么数组中所有10000的点及代表迷宫中未到达过的点,这样,我们把起点对应数组位置设为0,第一次循环后的位置对应数组设为1,这样我们再次进行循环时,若发现此位置对应数组中已经有了到达此位置的步数,则不去进行操作。
代码如下:
#include<stdio.h>
#include<stdl