11、迷宫问题

  • 思路:
1、先用二维数组模仿迷宫,并用数字代表墙,0:表示未走过;1:代表墙,表示不能走;2:表示走过,能走;3:表示走过,走不通
2、指定走出迷宫策略:按照下、右、上、左的顺序走迷宫
  • 代码实现:
package resursion;

import java.util.ArrayList;

public class Migong {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		//递归回溯应用:迷宫问题
		/*
		 * 思路:
		 * 1、先用二维数组模仿迷宫,并用数字代表墙,0:表示未走过;1:代表墙,表示不能走;2:表示走过,能走;3:表示走过,走不通
		 * 2、指定走出迷宫策略:按照下、右、上、左的顺序走迷宫
		 */
		
		int[][] map = new int[8][7];
		buildMap(map,8,7);
		migong(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();
		}
	}
	/**
	 * 构建地图
	 * @param map
	 */
	public static void buildMap(int[][] map,int x,int y) {
		//先把全部值置为0
		for (int i = 0; i < x; i++) {
			for (int j = 0; j < y; j++) {
				map[x-1][y-1] = 0;
			}
		}
		
		//开始构建墙 :最上一行和最下一行
		for(int j = 0 ; j < y; j++ ) {
			map[0][j] = 1;
			map[x-1][j] = 1;
		}
		
		//开始构建墙 :最左一列和最右一列
		for(int i = 0 ; i < x; i++ ) {
			map[i][0] = 1;
			map[i][y-1] = 1;
		}
		
		//开始构建墙 :横插一道
		
		map[x/2][0] = 1;
		map[x/2][1] = 1;
		map[x/2][2] = 1;
		
		//打印数据
		System.out.println("地图构建好:");
		for (int i = 0; i < x; i++) {
			for (int j = 0; j < y; j++) {
				System.out.print(map[i][j]);
			}
			System.out.println();
		}
		
	}
	
	/**
	 * 递归回溯应用:迷宫问题
	 * 思路:
	 * 1、先用二维数组模仿迷宫,并用数字代表墙,0:表示未走过;1:代表墙,表示不能走;2:表示通路,能走;3:表示走过,走不通
	 * 2、指定走出迷宫策略:按照下、右、上、左的顺序走迷宫
	 * @param map 迷宫当前的道路
	 * @param x   起点
	 * @param y
	 * @return true:表示能走通,false :表示走不通
	 */
	public static boolean migong(int[][] map,int x,int y) {
		if(map[6][5] == 2) {
			return true;
		}else if(map[x][y] == 0) {//未走过
			map[x][y] = 2;//假设该点可以走通
			if(migong(map,x+1,y)) {//下
				return true;
			}
			if(migong(map,x,y+1)) {//右
				return true;
			}
			if(migong(map,x-1,y)) {//上
				return true;
			}
			if(migong(map,x,y-1)) {//左
				return true;
			}
			map[x][y] = 3;
			return false;
		}else {
			return false;
		}
		
		
	}

}

注:可以通过更换策略,进行线路比较

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值