问题描述:
迷宫(maze)是一个矩形区域,它有一个入口和一个出口,入口位于迷宫的左上角,出口位于迷宫的右下角,在迷宫的内部包含不能穿越的墙和障碍物。迷宫路径搜索问题时寻找一条从入口到出口的路径,该路径是由一组位置组成的,每个位置上都设有障碍,且每个位置(第一个除外)都是前一个位置的东、南、西或北的邻居。
基本思路:
从迷宫的入口出发,沿正东方向顺时针对当前位置相邻的东、南、西、北四个位置依次进行判断,搜索可通行的位置。如果有,移动到这个新的相邻位置上,如果新位置是迷宫出口,那么已经找到一条路径,搜索工作结束,否则从这个新位置开始继续搜索通往出口的路径;若当前位置四周均无通路,则将当前位置从路径中删除出去,顺着当前位置的上一个位置的下一个方向继续走,直到到达出口(找到一条通路)或退回到入口(迷宫没有出路)时结束。
1.设计思路
1)迷宫数据结构的设计
设迷宫为m行n列矩阵,利用maze[m][n]来表示一个迷宫,“maze[i][j]=0或1”,其中0表示不通,1表示通。当从某点向下试探时,中间点有4个方向(东,南,西,北)可以试探,而四个角点有两个方向,其他边缘点有三个方向,为使问题简单化用maze[m+2][n+2]来表示迷宫,设迷宫的四周的值全部为0。
2)路径试探方向的数据设计
在迷宫矩阵中,每个点有4个方向去试探,用x表示行,y表示列。试探顺序可规定为:从当前位置向前试探的方向为从正东沿顺时针方向进行。为简化问题,方便地求出新点的坐标,将从正东开始沿顺时针进行的东、南、西、北四个方向用0,1,2,3表示,坐标增量放在一个结构数组move[4]中,每个元素由两个域组成:横坐标增量x和纵坐标增量y。如下所示: x y
0 | 0 | 1 |
1 | 1 | 0 |
2 | 0 | -1 |
3 | -1 | 0 |
用栈保存搜索的路径,路径中的每个数据元素不仅是顺序到达的各点坐标,还要记录从该点继续前进的方向,即没走一步,栈中记录的内容为(行,列,前进的方向)。
4)防止重复到达某点
当到达某点(i,j)后使maze[i][j]置-1,以便区别未到过的点,以防止重复试探某 位置的目的。
2.编程实现
import java.util.Stack;
class MPoint //栈中的数据元素用Mpoint表示