此问题中,迷宫用一个二位数组data[ ][ ]表示,data[i][j]的值为0,则表示该点为通路;如果为1,则表示该点为障碍;如果为-1,则表示该点已经走过。数组的四周值都为1,表示边界。给定起点和终点,求起点到终点的路径。
可以使用栈对二维数组进行深度优先搜索,直到找到终点的时候停止搜索。此方案找到的路径不一定是最短路径。如果要好到最短路径,可以使用队列来进行二维数组的宽度优秀搜索,直到找到终点停止搜索,然后从队列中找出我们需要的最短路径。废话少说,代码如下:
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
public class Maze {
private int[][] data = null;//数据1:障碍,0:出路,-1:此点已经通过
private Stack<Point> stack = new Stack<Point>() ;
private List<Point> queue = new ArrayList<Point>() ;//用数组模拟队列操作
public Maze(int[][] data){ //出使化
this.data = data ;
}
public boolean getPath(Point start , Point end){
boolean isFind = false ;//是否找到
Point temp = null;
stack.push(start) ;//将起点入栈
this.data[start.getX()][start.getY()] = -1 ;//起点标记为走过
while(!stack.isEmpty()){//栈不为空时进入循环
temp = stack.lastElement() ;//得到栈顶元素
int x = temp.getX() ;
int y = temp.getY() ;
int di = temp.getDirection() ;//得到方向
if(temp.equals(end)){//找到终点
printPath() ;
return true ;
}
isFind = false ;
while(di<4 && !isFind){//当方向没有找完,而且没有找到
di++ ;//下一个方向寻找
switch(di){
case 0: x = temp.getX() - 1 ; y = temp.getY() ; break ;//向上