迷宫问题

问题描述:
如下图,迷宫方格。目的:小黑走到小黄所在位置,即为成功。其中红色表示墙。黑色为起点,黄色为终点。
在这里插入图片描述
思想:递归 回溯
分析(想象一下是你在走迷宫):
1.你的目的是:从起点走到终点
2.设想一下你当前处于迷宫某一位置,开始走(往前后左右四个方向走)。
3假设第一步:往前走。那么第二部怎么走?(你是随机的走,还是用一种策略走。随机的意思是:第一步往前,第二部往前也可以走通,但是你想随心所欲,于是前后左右随便选了一条。策略的意思是:第一步往前,第二部也往前,如果往前走不通,就往右,右边走不通,就往左,左面不同,则往后。此时你的策略是前–右--左–后。)

代码:

public static void main(String[] args){
	//首先生成二位数组代替地图
	int[][] map = new int[10][10];
	//设置墙体障碍
	//在此 规定:红色 为1 表示墙体;白色未走过 为0 表示可走;
	//白色 走过的 为2 表示已走过; 走不通的为3 表示死路
	
	//设置障碍
	for(int i=0;i<10;i++){
			map[i][0]=1;
			map[i][9]=1;
		}
		
		for(int j=0;j<10;j++){
			map[0][j]=1;
			map[9][j]=1;
		}
		
		map[2][3]=1;
		map[2][6]=1;
		map[5][2]=1;
		map[5][7]=1;
		map[6][3]=1;
		map[6][6]=1;
		map[7][4]=1;
		map[7][5]=1;
		map[8][5]=1;
		
		for(int i=0;i<map.length;i++){
			for (int j = 0; j < map[i].length; j++) {
				System.out.print(map[i][j]+" ");
			}
			System.out.println();
		}
		
		//调用
		setWay(map,1,1);
		System.out.println("找到路径:");
		for(int i=0;i<map.length;i++){
			for (int j = 0; j < map[i].length; j++) {
				System.out.print(map[i][j]+" ");
			}
			System.out.println();
		}
	
}

/**
*map 表示地图
*i、j 表示位置
*投石问路
*/
public static boolean setWay(int[][] map,int i,int j){
	if(map[8][8]==2){
		return true;
	}else {
		if(map[i][j]==0){
			//可以理解为 来到map[i][j]的位置 
			//然后处于map[i][j]  的位置情况下 判断你的下一步 上下左右哪个方向可走
			//策略:下--右--上--左
			map[i][j]=2;
			if(setWay(map,i+1,j)){
			//在i,j 的位置 向下走;此时递归调用自己,来到i+1,j的位置。然后再判断
			//i+1,j 的上下左右
				return true;
			}else if(setWay(map,i,j+1)){
				return true;
			}else if(setWay(map,i-1,j)){
				return true;
			}else if(setWay(map,i,j-1)){
				return true;
			}else{
				map[i][j]=3;
				return false;
			}
		}else{
			return false;
		}
		
		
	}
}

在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值