package xin.com.x07;
package xin.com.x07;
public class game {
//迷宫游戏
/*
* @作者: 12032
* @方法描述: 找路方法,
* 1.找到路返回true
* 2.1代表障碍物 2.代表可以通过 3 代表走过但是不同;
* 3.找路的顺序是下右上左 逆时针顺序;
* 4.使用递归回溯的思想
* @日期: 10:03 2021/11/2
* @Param: [map, i, j];
* @返回参数类型: boolean
**/
static boolean findWay(int[][]map,int i,int j){
//判断是否找到出口;找到输出true 没有继续找
if(map[6][5] == 2){
return true;
}else {//首先判断当前位置是否为0 即没有走过的
if(map[i][j] == 0) {
//假定当前位置正确;
map[i][j] = 2;
//递归验证当前位置是否可以到达下一位置,如果可以返回true;
if (findWay(map, i + 1, j)) {
return true;
} else if (findWay(map, i, j + 1)) {
map[i][j + 1] = 2;
return true;
} else if (findWay(map, i, j - 1)) {
map[i][j - 1] = 2;
return true;
} else if (findWay(map, i - 1, j)) {
map[i - 1][j] = 2;
return true;
} else {
//如果不可以到达下一位置,就设置3 表示走过但是不能出去,
//当程序走到最后一步发现不是出口而是死胡同的时候;会回溯(逐步跳出递归的程序)把每个走过的位置变成3
map[i][j] = 3;
return false;
}
}
}
return false;
}
public static void main(String[] args) {
//设置迷宫地图
//1.设置迷宫大小
int[][] map = new int[8][7];
//2.设置障碍物
// 第一行和最后一行设置为1
for(int i = 0;i<map[i].length;i++){
map[0][i]=1;
map[7][i]=1;
}
// 第一列和最后一列设置为1
for (int i = 0 ; i<map.length;i++){
map[i][0]= 1;
map[i][6]=1;
}
// 单独设置障碍物
map[3][1] = 1;
map[3][2] = 1;
map[3][3] = 1;
map[2][3] = 1;
map[0][3] = 1;
map[6][4] = 1;
//遍历输出初始迷宫图;
System.out.println("开始之前的迷宫图");
for (int i = 0 ; i<map.length;i++){
System.out.println("");
for (int j = 0 ; j<map[i].length;j++){
System.out.print(map[i][j]+"\t");
}
}
// 调用方法找出路:
System.out.println("\n"+findWay(map,1,1));
//输出走出迷宫的道路线
System.out.println("出路");
for (int i = 0 ; i<map.length;i++){
System.out.println("");
for (int j = 0 ; j<map[i].length;j++){
System.out.print(map[i][j]+"\t");
}
}
}
}
运行结果 1代表障碍物 2代表出路 3代表做过但是行不通 进行测试 无出路的情况:
// 单独设置障碍物
map[3][1] = 1;
map[3][2] = 1;
map[3][3] = 1;
map[2][3] = 1;
map[1][3] = 1;
map[0][3] = 1;
map[6][4] = 1;
结果
总结:
这个小游戏很好的解释了递归和回溯,
递归:简单来说就程序自己调用自己;
回溯:回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。
回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法。
以上就是个人对于这个小游戏的总结和感悟;有什么不对的还请留言,谢谢。