求走迷宫问题的算法,要求用非递归回溯的方法写?
1个回答

public class MyMaze { private class Point { //自定义数组下标记录类型 int x = 0;

int y = 0; public Point() {

this(0, 0);

} public Point(int x, int y) {

this.x = x;

this.y = y;

} public boolean equals(Point p) {

return (x == p.x) && (y == p.y);

} @Override

public String toString() {

return "(" + x + "," + y + ")";

}

} private int[][] maze = null; //迷宫图

private java.util.Stack stack = new java.util.Stack();

//保存路径的栈 public MyMaze(int[][] maze) {

this.maze = maze;

} public void go() {

Point out = new Point(maze.length-1, maze[0].length-1); //出口

Point in = new Point(0,0); //入口

Point curNode = in; //当前点为入口

Point nextNode = null; //下一个访问点(目标点) while(!curNode.equals(out)) {

nextNode = new Point(curNode.x,curNode.y); //设置目标点为当前点,便于下面偏移

if((curNode.x+1)=0&&maze[curNode.x][curNode.y-1]==0) { //如果左边是空的,则目标点向左偏移

nextNode.y--;

} else { //这里是没有路的状态

maze[curNode.x][curNode.y] = 3; //标记为死路

if(stack.isEmpty()) { //判断栈是否为空

System.out.println("Non solution");

return;

}

curNode = stack.pop(); //弹出上一次的点

continue; //继续循环

} //如果有路的话会执行到这里

stack.push(curNode); //当前点压入栈中

maze[curNode.x][curNode.y] = 2; //标记为已走

curNode = nextNode; //移动当前点

} if(nextNode.equals(out)) {

stack.push(nextNode); //将出口点添加到当前路劲中

maze[nextNode.x][nextNode.y] = 2; //标记为已走

}

System.out.println("n该迷宫的一条可行路劲为:");

System.out.println("n"+stack);

} public static void main(String[] args) {

int[][] maze = {

{ 0, 0, 1, 0, 1, 0, 1, 0, 1, 0 },

{ 0, 0, 1, 1, 1, 0, 0, 0, 1, 0 },

{ 0, 1, 0, 0, 1, 0, 0, 0, 0, 1 },

{ 0, 0, 0, 0, 1, 0, 0, 0, 1, 1 },

{ 0, 0, 1, 0, 0, 0, 0, 0, 0, 1 },

{ 1, 0, 1, 0, 1, 0, 0, 1, 0, 0 },

{ 0, 1, 0, 0, 1, 0, 0, 1, 0, 1 },

{ 1, 0, 1, 0, 1, 1, 0, 1, 0, 0 }

};

new MyMaze(maze).go();

}

}