一、设计迷宫的的二维数组
* 外围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;}