java之迷宫问题


文章内容选自尚硅谷,jdk8,eclipse环境

java解决迷宫问题的注意事项

  • java在执行递归方法的时候,在栈空间中开辟了一块内存,当递归方法调用自己的时候,在栈空间中开辟另外一块内存
  • 递归方法必须有出口,不然会发生栈溢出错误
  • 递归方法的参数是相互独立的,但如果递归方法的参数是引用数据类型,则递归方法共享该数据类型的地址。
  • 递归方法在回溯的时候,可以分两种情况,第一种是递归方法执行完毕,第二种是遇到了return,返回相应的值。

在这里插入图片描述
图片选自尚硅谷

代码

package recursion;

public class Migong {

	public static void main(String[] args) {
		int[][] map = new int[8][7];
		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;
//		map[1][2] = 1;
//		map[2][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]+" "); //这儿加空格,不能用‘ ’单引号的形式,因为单引号空格会自动转换成ASCII码进行相加
			}
			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();
		}
		
	}
	
	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;
			}
			
		}
	}

}

运行结果

迷宫形状为
1 1 1 1 1 1 1
1 0 1 0 0 0 1
1 0 1 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
小球路径为
1 1 1 1 1 1 1
1 3 1 0 0 0 1
1 3 1 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

分析代码,我在复现代码的时候老是复现不出来,这个问题的难点在于if-else的嵌套必须搞清楚,这儿用了三个嵌套,这道题代码量很少,但是非常难。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
迷宫问题是指在一个矩阵中从起点开始,只能朝上、下、左、右四个方向移动,要求找到一条通向终点的路径。这个问题可以使用回溯算法来解决。 下面是一个Java迷宫问题回溯算法实现,具体注释在代码中。 ```java import java.util.Scanner; public class Maze { private int[][] maze; // 迷宫矩阵 private int[][] solution; // 路径矩阵 private int N; // 迷宫大小 // 构造函数 public Maze(int n) { N = n; maze = new int[N][N]; solution = new int[N][N]; } // 输入迷宫矩阵 public void inputMaze() { System.out.println("请输入迷宫矩阵:"); Scanner scanner = new Scanner(System.in); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { maze[i][j] = scanner.nextInt(); } } } // 输出迷宫矩阵 public void outputMaze() { System.out.println("迷宫矩阵:"); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { System.out.print(maze[i][j] + " "); } System.out.println(); } } // 输出路径 public void outputSolution() { System.out.println("路径:"); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { System.out.print(solution[i][j] + " "); } System.out.println(); } } // 判断当前位置是否可达 public boolean isSafe(int x, int y) { // 判断是否越界 if (x >= 0 && x < N && y >= 0 && y < N && maze[x][y] == 1 && solution[x][y] == 0) { return true; } return false; } // 回溯算法求解迷宫问题 public boolean solve(int x, int y) { if (x == N - 1 && y == N - 1) { // 到达终点 solution[x][y] = 1; return true; } if (isSafe(x, y)) { // 当前位置可达 solution[x][y] = 1; // 标记为已经走过 if (solve(x + 1, y)) { // 向下走 return true; } if (solve(x, y + 1)) { // 向右走 return true; } if (solve(x - 1, y)) { // 向上走 return true; } if (solve(x, y - 1)) { // 向左走 return true; } solution[x][y] = 0; // 四个方向都无法到达终点,回溯 return false; } return false; } public static void main(String[] args) { Maze maze = new Maze(5); // 创建一个5x5的迷宫 maze.inputMaze(); // 输入迷宫矩阵 maze.outputMaze(); // 输出迷宫矩阵 if (maze.solve(0, 0)) { // 从起点开始求解迷宫问题 maze.outputSolution(); // 输出路径 } else { System.out.println("无解!"); } } } ``` 该算法的时间复杂度为$O(4^{n^2})$,因为对于每个位置都有四个方向可以选择,而迷宫的大小是$n \times n$。因此,该算法只适用于小规模的迷宫问题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值