一.初始化地图分析
1.设置地图
用二维数组map[][]设置出一个棋盘,暂定为10*10
即
//设置地图大小
int map[][] = new int[10][10];
2.初始化地图
规定初始化棋盘时的路与障碍物,暂定0为路,1为障碍物
即可设置地图边界与障碍物
//设置地图边界,障碍物表示为 1
for (int i = 0; i < map.length; i++) {
map[i][0] = 1;
map[i][map[i].length - 1] = 1;
}
for (int j = 0; j < map.length; j++) {
map[0][j] = 1;
map[map.length-1][j] = 1;
}
//设置障碍物
for (int i = 1; i <= 3; i++) {
map[3][i] = 1;
}
3.查看初始化地图
二.找路分析
1.定义地图中的各数据含义
暂定 0 为路,1 为障碍物, 2 为走过且可走的路, 3 为无法走的路
2.定义方法
public boolean findWayb3(int map[][], int i, int j)
PS: i , j 为地图位置
3.定义出口
暂定为map[8][8] 为出口
//设置地图出口
if (map[8][8] == 2) {
return true;
}
4.方法核心代码
if (map[i][j] == 0) {
//先假定该位置能走
map[i][j] = 2;
if (findWayb3(map, i + 1, j)) {//向下走
return true;
} else if (findWayb3(map, i, j + 1)) {//向右走
return true;
} else if (findWayb3(map, i - 1, j )) {//向上走
return true;
}else if (findWayb3(map, i, j-1)) {//向左走
return true;
} else{//如果都走不了
map[i][j] = 3;
return false;
}
}
return false;
代码解析:
当该位置正好为0时,进入核心代码,先假定该位置能继续走, 所以设置为 2 。
此时首先向下走,进入方法回溯, 比如进入回溯前,位置在map[2][1], 该位置为 0 ,
进入第一个回溯,位置变为map[3][1]后重新进入方法,已知map[3][1]已经设置成了1,
所以在回溯中无法进入if (map[i][j] == 0),直接返回false
向下走的回溯为false后,进入下一个回溯,即向右,进入向右回溯的位置为map[2][1]
进入回溯后,位置为map[2][2],该位置为0,能走,即进入if (map[i][j] == 0),将该位置变成2,然后再次重复以上
5.查看完成路径后地图
三.完整代码展示
public class 迷宫问题{
public static void main(String[] args){
//设置地图大小
int map[][] = new int[10][10];
//设置地图边界,障碍物表示为 1
for (int i = 0; i < map.length; i++) {
map[i][0] = 1;
map[i][map[i].length - 1] = 1;
}
for (int j = 0; j < map.length; j++) {
map[0][j] = 1;
map[map.length-1][j] = 1;
}
//设置障碍物
for (int i = 1; i <= 3; i++) {
map[3][i] = 1;
}
//查看地图初始情况
Mytools m1 = new Mytools();
System.out.println("======显示初始化地图情况======");
m1.printIntArrayTwo(map);
text m2 = new text();
m2.findWayb3(map, 1, 1);
//查看地图路径情况
System.out.println("======显示地图路径情况======");
m1.printIntArrayTwo(map);
}
}
class text{
public boolean findWay(int map[][], int i, int j){//i, j 是初始位置
//设置地图出口
if (map[8][8] == 2) {
return true;
}
if (map[i][j] == 0) {
//先假定该位置能走
map[i][j] = 2;
if (findWayb3(map, i + 1, j)) {//向下走
return true;
} else if (findWayb3(map, i, j + 1)) {//向右走
return true;
} else if (findWayb3(map, i - 1, j )) {//向上走
return true;
}else if (findWayb3(map, i, j-1)) {//向左走
return true;
} else{//如果都走不了
map[i][j] = 3;
return false;
}
}
return false;
}
}
public class Mytools {
//打印int 类型二维数组
public void printIntArrayTwo(int array[][]){
for(int i = 0; i < array.length; i++){
for (int j = 0; j < array[i].length; j++) {
System.out.print(array[i][j] + "\t");
}
System.out.println();
}
}
}
欢迎评论区交流,一起学习