回溯其实主要体现的就是递归中的“归”
当小球发现某路径点不通的时候,会影响到前一个路径点的判断
package DataStructure;
/**
* Created with IntelliJ IDEA.
* Description:
* User: 86178
* Date: 2024-02-26
* Time: 13:37
*/
public class MiGong {
public static void main(String[] args) {
//todo 先创建二维数组 模拟迷宫
int[][] map=new int[8][7];
//1 墙 0 路
for(int i=0;i<8;i++){
for(int j=0;j<7;j++){
if(i==0 || i==7 || j==0 || j==6){
map[i][j]=1;
}else{
map[i][j]=0;
}
}
}
map[3][1]=1;
map[3][2]=1;
map[1][2]=1;
map[2][2]=1;
System.out.println("map如下");
for (int[] ints : map) {
for (int anInt : ints) {
System.out.print(anInt+" ");
}
System.out.println();
}
setWay(map,1,1);
System.out.println("迷宫路线如下");
for (int[] ints : map) {
for (int anInt : ints) {
System.out.print(anInt+" ");
}
System.out.println();
}
//todo 在回溯过程中 将原来的2 改为 3
}
//todo 使用递归回溯给小球找路 (i,j) 小球的起始位置 (6,5) 结束位置
//todo 0 未走过 1 墙 2 通路 3 走不通
//todo 策略 下-右-上-左, 走不通回溯
public static boolean setWay(int[][] map,int i,int j){
if(map[6][5]==2){
//通路已经找到
return true;
}else{
if(map[i][j]==0){
//如果当前点没有走过
map[i][j]=2;//假定可以走通
if(setWay(map,i+1,j)){
return true;
}else if(setWay(map,i,j+1)){
return true;
}else if(setWay(map,i-1,j)){
return true;
}else if(setWay(map,i,j-1)){
return true;
}else{
//说明走不通
map[i][j]=3;
return false;
}
}else{
return false;
}
}
}
}