package com.cai.learn.math;
/**
* 迷宫回溯:
* 目标:用递归方法达到指定位置
*/
public class MazeQuestion {
public static void main(String[] args) {
//搭建简单的迷宫
int[][] maze = new int[8][7];
//搭建四周 以数字1 表示挡板
//左右两竖排
for (int i = 0; i < 8; i++) {
maze[i][0] = 1;
maze[i][6] = 1;
}
//上下两横排
for (int i = 0; i < 7; i++) {
maze[0][i] = 1;
maze[7][i] = 1;
}
//中间设置2个挡格 maze[3][1] maze[3][2]
maze[3][1] =1;
maze[3][2] =1;
/*基本形成:
1 1 1 1 1 1 1
1 0 0 0 0 0 1
1 0 0 0 0 0 1
1 1 1 0 0 0 1
1 0 0 0 0 0 1
1 0 0 0 0 0 1
1 0 0 0 0 0 1
1 1 1 1 1 1 1
*/
//目标:从maze[1][1] --->maze[6][5]
setWay(maze,1,1);
for (int i = 0; i < 8; i++) {
for (int j = 0; j <7 ; j++) {
System.out.print(maze[i][j]+"\t");
}
System.out.println();
}
/*基本实现 2是所走的路线
1 1 1 1 1 1 1
1 2 0 0 0 0 1
1 2 2 2 0 0 1
1 1 1 2 0 0 1
1 0 0 2 0 0 1
1 0 0 2 0 0 1
1 0 0 2 2 2 1
1 1 1 1 1 1 1
*/
}
/**
* 说明:
* 1.maze表示地图
* 2.i,j表示开始位置(1.1)
* 3.如果能移动到位置(7.5),则说明找到
* 4.约定:0.表示没有走过的路,1表示此路不通,2表示通路可以走,3.表示已经走过但此路不通
* 5.在走迷宫时,需要一个策略(方法) 下->右->上->左,若果走不通,再回溯
*
* @param maze 模拟地图数组
* @param i 横坐标
* @param j 纵坐标
* @return
*/
public static boolean setWay(int[][] maze,int i,int j){
if(maze[6][5]==2){
return true;
}else{
if(maze[i][j]==0){//表示未走过
//下->右->上->左
maze[i][j] = 2;
if(setWay(maze,i+1,j)){
return true;
}else if(setWay(maze,i,j+1)){
return true;
}else if(setWay(maze,i-1,j)){
return true;
}else if(setWay(maze,i,j-1)){
return true;
}else{
maze[i][j] = 3;
return false;
}
}else{
return false;
}
}
}
}