public class Exercise{
public static void main(String[] args){
//迷宫问题
//创建迷宫
//思路
//1. 先创建迷宫,用二维数组表示 int[][] map = new int[8][7];
//2. 先规定 map 数组的元素值: 0 表示可以走 1 表示障碍物
int[][] map = new int[8][7];
//3. 将最上面的一行和最下面的一行,全部设置为 1
for(int i = 0; i < 7; i++) {
map[0][i] = 1;
map[7][i] = 1;
}
//4.将最右面的一列和最左面的一列,全部设置为 1
for(int i = 0; i < 8; i++) {
map[i][0] = 1;
map[i][6] = 1;
}
//5、将单个位置设为障碍
map[3][1] = 1;
map[3][2] = 1;
map[2][2] = 1; //测试回溯
// map[2][1] = 1;
// map[2][2] = 1;
// map[1][2] = 1;
//输出当前的地图
System.out.println("=====当前地图情况======");
for(int i = 0; i < map.length; i++) {
for(int j = 0; j < map[i].length; j++) {
System.out.print(map[i][j] + " ");//输出一行
}
System.out.println();
}
Tool01 tool = new Tool01();
tool.findWay(map,1,1);
//输出找路之后的地图
System.out.println("=====寻找之后地图情况======");
for(int i = 0; i < map.length; i++) {
for(int j = 0; j < map[i].length; j++) {
System.out.print(map[i][j] + " ");//输出一行
}
System.out.println();
}
}
}
class Tool01{
//0, 原来就可以走
//1,原来就有障碍物
//2,探测确实可以走
//3,探测后发现不能走
public boolean findWay(int[][] arr,int i,int j){
if(arr[6][5] == 2){
return true;
}else{
if (arr[i][j] == 0) {
//第一个位置假定设为能走
arr[i][j] = 2;
// if(arr[i+1][j] == 0){
// //!!!!!!!错误之处
// //语句在这里递归,到此if最内一层时没有返回值,而且括号内的判断
// //而且括号内的判断,此函数本身就能执行,
// //判断下一个位置是否走的通
// //所以应该用下面那种方式
// findWay(arr,i+1,j);
// }else if(arr[i+1][j] == 0){
// findWay(arr,i,j+1);
// }else if(arr[i+1][j] == 0){
// findWay(arr,i-1,j);
// }else if(arr[i+1][j] == 0){
// findWay(arr,i,j-1);
// }else{
// arr[i][j] = 3;
// }
if(findWay(arr,i+1,j)){ //往下走,往后逆时针判断,当然顺时针也ok
return true;
}else if(findWay(arr,i,j+1)){//往右走
return true;
}else if(findWay(arr,i-1,j)){//往上走
return true;
}else if(findWay(arr,i,j-1)){//往左走
return true;
}else{
//是死路,没走通,此后,会返回上一层findWay()
//比如上一层访问的是往下走,但由于方法返回false,不满足if
//于是往下一if走(往右走)。
//此例第一个位置就会出现。
arr[i][j] = 3;
return false;
}
}else{ //位置为1,2,3
return false; //????????????
}
}
}
}
运行结果