迷宫出逃

一、设计迷宫的的二维数组

* 外围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;
}



转载于:https://my.oschina.net/findurl/blog/343774

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值