构造一个简易的迷宫,8行7列,红色为墙或者挡板,以箭头所知的方向(6,5)作为终点,小球从(1,1)开始移动 。
找路的策略 :
/**
*
* @param map 表示地图
* @param i
* @param j i 和 j 表示起点坐标
* @return 返回是否可以找到一条通路
*/
public static boolean setWay(int [][] map, int i, int j){
// 默认寻找路径为: 下 右 上 左
if(map[6][5] == 2){ // 以 (6,5) 该点坐标作为重点,如果该点为2,说明可以找到路径
return true;
}else{
if(map[i][j] == 0){ // 表示还未走过
map[i][j] = 2; // 尝试(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{ // (i,j)可能是1,2,3
return false;
}
}
}
整体代码:
/*
* 项目名称:ANA
* 文件名称:Maze.java
* Date:2023/10/6 上午10:20
* Author:yan_Bingo
* Content:迷宫回溯
*/
package Learning;
/**
* @author Yan_Bingo
* @version 1.0
* Create by 2023/10/6 10:20
*/
public class Maze {
public static void main(String[] args) {
// 初始化一个二维数组作为迷宫地图
int [][] map = new int[8][7];
/*
* 默认以 1 作为墙体, 2 作为当前该路径可走, 3 表示该点已经走过,但是走不通
* */
for (int i = 0; i < 7; i++) {
map[0][i] = 1;
map[7][i] = 1;
}
for (int i = 0; i < 8; i++) {
map[i][0] = 1;
map[i][6] = 1;
}
// 设置两块挡板
map[3][1] = 1;
map[3][2] = 1;
System.out.println("原本的地图情况");
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 7; j++) {
System.out.print(map[i][j] + " ");
}
System.out.println();
}
System.out.println();
setWay(map,1,1);
System.out.println("走过的地图情况");
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 7; j++) {
System.out.print(map[i][j] + " ");
}
System.out.println();
}
}
// 寻找迷宫的路径
/**
*
* @param map 表示地图
* @param i
* @param j i 和 j 表示起点坐标
* @return 返回是否可以找到一条通路
*/
public static boolean setWay(int [][] map, int i, int j){
// 默认寻找路径为: 下 右 上 左
if(map[6][5] == 2){ // 以 (6,5) 该点坐标作为重点,如果该点为2,说明可以找到路径
return true;
}else{
if(map[i][j] == 0){ // 表示还未走过
map[i][j] = 2; // 尝试(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{ // (i,j)可能是1,2,3
return false;
}
}
}
}