Java_老鼠出迷宫/汉诺塔

递归:递:传递        归:返回

回溯:从问题的某一状态出发,搜索从这一状态出发所能达到的所有状态,当一条路走到“尽头”时,再后退一步。从另一种可能的状态出发,继续搜索,直到所有的路径都试探过。

这种不断前进,不断后退回溯的方法就叫这个。

思路:使用递归回溯的思想

1.findWay方法为专门来找出迷宫的路径

2.如果找到了,返回true,否则返回false

3.map是二维数组,也就是迷宫

4.i, j是老鼠的位置,初始化是(1,1)

5.因为是递归找数,所以要赋于数组元素各个值的意义

        0表示可以走

        1表示障碍物

        2表示是通路

        3表示走过,但是死路

6.map[6][5] = 2就是找到了一条通路,结束,否则继续找。

7.找路策略:下,右,上,左

// 迷宫问题
public class Maze {
	public static void main(String[] args) {
		// 先创建迷宫,元素是0代表可以走,为1是障碍物
		int[][] map = new int[8][7];
		// 将迷宫的第一行和最后一行置为1
		for (int i = 0; i < 7; ++i) {
			map[0][i] = map[7][i] = 1;
		}
		// 将迷宫的第一列和最后一列置为1
		for (int i = 0; i < 8; ++i) {
			map[i][0] = map[i][6] = 1;
		}
		map[3][1] = map[3][2] = 1;
		
		// 极端情况
		map[1][2] = map[2][1] = map[2][2] = 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();
		}

		T t1 = new T();
		t1.findWay(map, 1, 1); // 引用传递,会影响main方法中的数组
		System.out.println("\n===找路后===");
		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();
		}
	}
}

class T {
	public boolean findWay(int[][] map, int i, int j) {
		// 0 可以走
		// 1 障碍物
		// 2 是通路
		// 3 是死路
		if (map[6][5] == 2) { // 终点通了,成功
			return true;
		} else { // 继续找
			if (map[i][j] == 0) { // 0是可以走,但还没走过
				// 假定可以走通
				map[i][j] = 2;
				// 使用策略来判断该位置是否能够真的走通
				// 下,右,上,左
				if (findWay(map, i + 1, j)) { // 下
					return true;
				} else if (findWay(map, i, j + 1)) { // 右 
					return true;
				} else if (findWay(map, i - 1, j)) { // 上
					return true;
				} else if (findWay(map, i, j - 1)) { // 左
					return true;
				} else { // 假定失败,是死路
					map[i][j] = 3;
					return false;
				}
			} else { // 1是障碍物走不了,2是通路已经测试过了,3是死路
				return false;
			}
		}
	}
}

public class HanoiTower {
	public static void main(String[] args) {
		Tower tower = new Tower();
		tower.move(5, 'a', 'b', 'c');
	}
}

class Tower {
	public void move(int num, char a, char b, char c) {
		if (num == 1) {
			System.out.println(a + "->" + c);
		} else {
			move(num - 1, a, c, b); // a上面的部分借助c移动到b
			System.out.println(a + "->" + c);
			move(num - 1, b, a, c);
		}
	}
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值