迷宫回溯问题--java实现

在这里插入图片描述

	/*迷宫问题:
	 * 若要找最短路径,可改变搜索顺序,最后计算2的个数
	 * 原先的地图
		1  1  1  1  1  1  1 
		1  0  0  0  0  0  1 
		1  0  0  0  0  0  1  
		1  1  1  0  0  0  1 
		1  0  0  0  0  0  1 
		1  0  0  0  0  0  1 
		1  0  0  0  0  0  1 
		1  1  1  1  1  1  1 
	 */
public class MiGong{
    public static void main(String[] args) {
	  // TODO Auto-generated method stub
	  //先创建一个二维数组,模拟迷宫
	  //地图
	  int[][] map = new int [8][7];
	  //使用1表示墙
	  //上下全部置为1
	  for(int i=0;i<7;i++) {
	      map[0][i] = 1;
	      map[7][i] = 1;
	  }
	  //左右全部置为1
	  for(int i=0;i<8;i++) {
	      map[i][0] = 1;
	      map[i][6] = 1;
	  }
	  //设置挡板 1表示
	  map[3][1] = 1;
	  map[3][2] = 1;
  
	  //输出地图
	  System.out.println("原先的地图");
	  for(int i=0;i<8;i++) {
	      for(int j=0;j<7;j++) {
	    	 System.out.print(map[i][j] + " ");
	      }
	      System.out.println();
	  }
	  //使用递归回溯给小球找路
	  setWay(map,1,1);
	  //输出新的地图,小球走过,并标识过的地图
	  System.out.println("新的地图,小球走过,并标识过的地图");
	  for(int i=0;i<8;i++) {
	      for(int j=0;j<7;j++) {
	           System.out.print(map[i][j] + " ");
	      }
	      System.out.println();
	  }
    }   
     //使用递归回溯来给小球找路
     //1. map表示地图
     //2. i,j表示从地图的哪个位置开始出发(1,1)
     //3. 如果小球能到map[6][5]位置,则说明通路找到
     //4. 约定:当map[i][j]为0 表示该点没有走过 当为1表示墙,2表示通路可以走,3该位置已经走过,但走不通
     //5. 在走迷宫时,需要制定一个策略(方法),下-》右-》左-》上,如果该点走不通,再回溯
     public static boolean setWay(int[][]map , int i,int j) {
         if(map[6][5] == 2) {//通路已找到 ok
              return true;
         }else {
	       if(map[i][j] == 0) {//如果当前这个点还没走过
	              //按照策略 下-》右-》上-》左   走
	             map[i][j] = 2 ;//假定该点是可以走通的
	             if(setWay(map,i+1,j)) {//向下走
	                 return true;
		     }else if(setWay(map,i,j+1)){//向右走
		         return true;
	  	     }else if(setWay(map,i-1,j+1)){//向上走
		         return true;
		     }else if(setWay(map,i,j-1)){//向左走
		         return true;
		     }else {
		         //说明该点是走不通的,是死路
		         map[i][j] = 3;
		         return false;
		     }  
	         }else {
		     //如果map[i][j] != 0, 可能是1,2,3
		     return false;
		}
	   }
     }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值