package Recursion;
import java.util.Arrays;
/**
* @author ct_start
* @create 2021 -08 -27
**/
// 迷宫问题
public class Recursion02 {
public static void main(String[] args) {
// 二维数组模拟迷宫
int arr [] [] =new int [8][7]; // 8行 7列 但是数组的下标只能取到length-1
// 使用 1 表示墙,先把上下全部置为1
for (int i = 0; i < 7; i++) {
arr[0][i]=1;
arr[7][i]=1;
}
// 使用1 把左右也全部置为1
for (int i = 0; i < 8; i++) {
arr[i][0]=1;
arr[i][6]=1;
}
// 再设置两个挡板 第4行的第2,3 列设置为挡板
arr[3][1]=1; arr[3][2]=1;
SearchWay(arr,1,1);
// 输出二位数组
show(arr);
}
public static void show (int [] [] arr){
// 先从行开始遍历输出
for (int i=0;i<arr.length;i++){ // 这里是行
for (int j=0;j<arr[i].length;j++){ // 这里是列
System.out.print(arr[i][j]+",");
}
System.out.println();
}
}
// 使用递归回溯给小球找路 i 和 j 表示从哪个位置开始寻找 (i,j), 如果能到 (6,5) 这个位置则表示通路找到了
// 约定: 当地图的节点为0时,表示该点没有被走过,如果为2时,表示是一个通路可以走 ; 如果这个地方为3 表示该位置已经走过但是走不通
// 定义策略: 先走哪里,再走哪里 下 右 上 左
public static boolean SearchWay(int [][]arr,int i,int j){
// 第一步写递归的返回条件
if (arr[6][5]==2){
return true;
}
else {
// 先把进来的第一个点 设置为可以走的,向下探测
if (arr[i][j]==0){
arr[i][j]=2;
if (SearchWay(arr,i+1,j)){ // 向下探测,如果进去探测下一个就是终点的话直接返回 if就是为真,则程序结束
return true;
}
else if (SearchWay(arr,i,j+1)){
return true;
}
else if (SearchWay(arr,i-1,j)){
return true;
}
else if (SearchWay(arr,i,j-1)){
return true;
}
else {
arr[i][j]=3;
return false;
}
} else {
return false;
}
}
}
}
递归解决迷宫回溯问题
最新推荐文章于 2022-01-17 22:34:23 发布