以一个MxN的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,判断有无通路。如果有通路,求出一条从入口到出口的通路
定义一个MxN的矩阵maze(二维数组),当maze[i][j]为0时,则意味着该节点可以通行,为1则表示该节点不可行。从起点开始,每次移动的方向只有四个,分别是上、下、左、右。如果走过一个节点,就入栈,当该节点的三个方向都有障碍物不能通行时则要出栈,退回到上一个节点。每通过一个节点则将该节点之设置为2如maze[i][j]=2,如果该节点的下一个节点都是不可行,则将该节点设为-1,即不可达如maze[i][j]=-1.问题本身其实并不复杂,但要注意的就是边界及回退。具体代码和输出结果如下。
package dataStructure;
import java.util.Stack;
/*
* 迷宫问题,判断是否能走出迷宫,及需要的步骤
* 按上下左右步骤进行
* 1表示有障碍
* 0表示没有障碍
*/
public class MazeSolution {
public static int[][] maze = null;
public static void main(String args[]) {
maze = new int[][]{
{1,1,1,1,1,1,1,1,0,1},
{1,0,0,1,0,0,0,1,0,1},
{1,0,0,0,0,1,1,0,0,1},
{1,0,1,1,1,0,0,0,0,1},
{1,0,1,1,1,0,0,0,0,1},
{1,0,0,0,1,0,0,0,0,0},
{1,0,1,0,0,0,1,0,0,1},
{1,0,1,1,1,0,1,1,0,1},
{1,1,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1}
};
boolean flag = isEscapeMaze(maze,new int[] {1,1},new int[] {8,8});
if(flag) {
System.out.println("success");
}else {
System.out.println("fail");
}
}
/*
* 按右下左上顺序执行
*/
public static boolean isEscapeMaze(int[][] maze,int[] source,int target[]) {
Stack<int[]> stack = new Stack();
stack.push(source);
maze[source[0]][source[1]] = 2;
int length_x = maze.length;
int length_y = maze[0].length;
int[] x = {-1,1,0,0};
int[] y = {0,0,-1,1};
while(!stack.isEmpty()) {
int[] cur = stack.peek();
if(cur[0] == target[0] && cur[1] == target[1]) {
printResult();
return true;
}
int i;
for(i=0;i<4;i++) {
int row = cur[0]+x[i];
int column = cur[1] + y[i];
if(row == length_x || column == length_y || row == -1 || column == -1) {
//最外围就不处理了,继续循环
}else {
if(maze[row][column] == 0) {
stack.push(new int[] {row,column});
maze[row][column] = 2;
break;
}
}
}
if(i==4) {
stack.pop();
maze[cur[0]][cur[1]] = -1;
}
}
return false;
}
public static void printResult() {
for(int i=0;i<maze.length;i++) {
for(int j=0;j<maze[i].length;j++) {
System.out.print(maze[i][j]+"\t");
}
System.out.println();
}
}
}