代码中由详细注释,不理解的留言
// 此种使用 ,下→右→上→左,的找路策略,来确定该位置是否真的可以走通
public class MiGong {
public static void main(String[] args){
// 实现迷宫
// 思路分析:
// 创建一个二维数组用来表示地图,int[][] map = new int[8][7]
// 规定map数组的元素值:0 - 表示可以走, 1 - 表示不可以走
int[][] map = new int[8][7];
// 将map数组的第一行跟最后一行设置成1,表示不可以走
for (int i = 0;i < 7;i++){
map[0][i] = 1;
map[7][i] = 1;
}
// 将map数组的第一列跟最后一列设置成1,表示不可以走
for (int i = 0;i < 8;i++){
map[i][0] = 1;
map[i][6] = 1;
}
// 单独对map[3][1]map[3][2]设置
map[3][1] = 1;
map[3][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();
}
T2 test = new T2();
test.findWay(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();
}
}
}
class T2{
/*
使用递归回溯的思想来解决老鼠出迷宫
解读:
1.findWay方法就是专门来找出迷宫的路径
2.如果找到,就返回 TRUE ,否则返回false
3.使用二维数组map,表示迷宫地图
4.i,j就是老鼠的位置,初始化的位置为[1][1]
5.因为我们是递归的找路,所以我们先规定,map数组的各个值的含义
6.0——表示可以走,1——表示障碍物,2——表示可以走,3——表示走过,但是走不通是死路
7.当map[6][5] = 2 就说明找到通路,就可以结束,否则就继续找
8.先确定老鼠的找路策略,下、右、上、左,的顺序判断下一步走的方向
*/
// 将地图map,以及老鼠的初始化位置传递给方法
public boolean findWay(int[][] map,int i,int j){
if (map[6][5] == 2){//找到了,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] = 1,2,3
map[i][j] = 3;
return false;
}
}else {
return false;
// 有的同学可能会想如果初始值为一个不为0的值,则老鼠一次也不执行,考虑到这个问题,
// 老鼠固定起始位置[1][1]
}
}
}
}
// 此种使用 ,上→右→下→左,的找路策略,来确定该位置是否真的可以走通
更改确定该位置是否真的可以走通,的方法回溯语句
public class MiGong {
public static void main(String[] args){
// 实现迷宫
// 思路分析:
// 创建一个二维数组用来表示地图,int[][] map = new int[8][7]
// 规定map数组的元素值:0 - 表示可以走, 1 - 表示不可以走
int[][] map = new int[8][7];
// 将map数组的第一行跟最后一行设置成1,表示不可以走
for (int i = 0;i < 7;i++){
map[0][i] = 1;
map[7][i] = 1;
}
// 将map数组的第一列跟最后一列设置成1,表示不可以走
for (int i = 0;i < 8;i++){
map[i][0] = 1;
map[i][6] = 1;
}
// 单独对map[3][1]map[3][2]设置
map[3][1] = 1;
map[3][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();
}
T2 test = new T2();
test.findWay(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();
}
}
}
class T2{
/*
使用递归回溯的思想来解决老鼠出迷宫
解读:
1.findWay方法就是专门来找出迷宫的路径
2.如果找到,就返回 TRUE ,否则返回false
3.使用二维数组map,表示迷宫地图
4.i,j就是老鼠的位置,初始化的位置为[1][1]
5.因为我们是递归的找路,所以我们先规定,map数组的各个值的含义
6.0——表示可以走,1——表示障碍物,2——表示可以走,3——表示走过,但是走不通是死路
7.当map[6][5] = 2 就说明找到通路,就可以结束,否则就继续找
8.先确定老鼠的找路策略,下、右、上、左,的顺序判断下一步走的方向
*/
// 将地图map,以及老鼠的初始化位置传递给方法
public boolean findWay(int[][] map,int i,int j){
if (map[6][5] == 2){//找到了,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] = 1,2,3
// map[i][j] = 3;
// return false;
// }
// }else {
// return false;
// // 有的同学可能会想如果初始值为一个不为0的值,则老鼠一次也不执行,考虑到这个问题,
// // 老鼠固定起始位置[1][1]
// }
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] = 1,2,3
map[i][j] = 3;
return false;
}
}else {
return false;
// 有的同学可能会想如果初始值为一个不为0的值,则老鼠一次也不执行,考虑到这个问题,
// 老鼠固定起始位置[1][1]
}
}
}
}