一、设计迷宫的的二维数组
* 外围1表示的墙壁,0表示路标
* 1,1,1,1,1,1,1,1,1,1
* 1,0,1,1,1,0,1,1,1,1
* 1,1,0,1,0,1,1,1,1,1
* 1,0,1,0,0,0,0,0,1,1
* 1,0,1,1,1,0,1,1,1,1
* 1,1,0,0,1,1,0,0,0,1
* 1,0,1,1,0,0,1,1,0,1
* 1,1,1,1,1,1,1,1,1,1
*/
外围1表示墙壁,0表示路径
二、问题分析
1.寻路方向选择
在迷宫的入口点开始,围绕这个点有8个方向可以选择。
2.路标的记录
在每个可以走的地方也就是路径进行入栈处理。
3.路标入栈了可能出现的问题
3.1此路不通怎么办也就是前面可能是同过的
如果是标记了那么这个路是走过的,就不用再走了,出栈就可以了
此路是同的那么结果就是路径了
三、总的来说
1循环+堆栈
首先入口入栈
栈有值了,四面八方寻找
栈找到了,不是终点,那么放进去继续寻找,如果是死胡同,那么修改过出栈就可以了
那么栈就是结果
2.递归
递归终结时边界可以出逃
不是四面八方寻找,如果死胡同了,继续寻找,如果找到了那么不用四面八方了终结掉寻找
四、代码
import java.util.Stack;
/**
* 迷宫出逃程序
* WZ 2014-11-08
*/
public class Maze {
/*
* 1.首先需要个迷宫 8*10 有效路径(1,1)(6,8)
* 外围1表示的墙壁,0表示路标
* 1,1,1,1,1,1,1,1,1,1
* 1,0,1,1,1,0,1,1,1,1
* 1,1,0,1,0,1,1,1,1,1
* 1,0,1,0,0,0,0,0,1,1
* 1,0,1,1,1,0,1,1,1,1
* 1,1,0,0,1,1,0,0,0,1
* 1,0,1,1,0,0,1,1,0,1
* 1,1,1,1,1,1,1,1,1,1
*/
int mazeArray[][]={
{1,1,1,1,1,1,1,1,1,1},
{1,0,1,1,1,0,1,1,1,1},
{1,1,0,1,0,1,1,1,1,1},
{1,0,1,0,0,0,0,0,1,1},
{1,0,1,1,1,0,1,1,1,1},
{1,1,0,0,1,1,0,0,0,1},
{1,0,1,1,0,0,1,1,0,1},
{1,1,1,1,1,1,1,1,1,1}
};
int move[][] = {{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}};
boolean flage=false;
public int path(int mazeArray[][],int directArray[][],Stack s){
Position p=new Position(1,1,-1);
s.push(p);
while(!s.isEmpty()){
p=(Position) s.pop();
int x=p.x;
int y=p.y;
int d=p.d+1;
while(d<8){
int i=x+directArray[d][0];
int j=y+directArray[d][1];
if(mazeArray[i][j]==0){
p=new Position(i,j,d);
s.push(p);
x=i;
y=j;
mazeArray[x][y]=-1;
if(x==6&&y==8)
return 1;
else
d=0;
}else
d++;
}
}
return 0;
}
public static void main(String[] args) {
Maze m=new Maze();
// Stack s=new Stack();
// int a=m.path(m.mazeArray, m.move, s);
// while(!s.isEmpty()){
// Position p=(Position) s.pop();
// System.out.println(p.x+" "+p.y);
// }
m.recursive(1, 1);
}
/**
* 递归实现迷宫出逃
*/
public void recursive(int x,int y){
int now=mazeArray[x][y];
if(now==0&&(x==6||y==8)){
mazeArray[x][y]=-1;
flage=true;
System.out.println("出逃步骤:"+x+" "+y);
}else if(now==0){
//修改这里的值
mazeArray[x][y]=-1;
for(int i=0;i<8;i++){
recursive(x+move[i][0],y+move[i][1]);
if(flage){
System.out.println("出逃步骤:"+x+" "+y);
break;
}
}
}else{
return;
}
}
}
class Position{
public Position(int x,int y, int d){
this.x=x;
this.y=y;
this.d=d;
}
int x;
int y;
int d;
}