算法_递归_回溯_迷宫问题

怼烎@ 2023-07-10 14:04 74阅读 0赞

文章目录

    • 问题描述
    • 准备工作
      • 绘制迷宫
      • 打印迷宫
    • 走迷宫
    • 测试

问题描述

判断一个迷宫是否可以走通。
注意:非求最优解,仅通过回溯判断是否有解

准备工作

绘制迷宫

  1. /**
  2. * 绘制地图
  3. * @param maze
  4. */
  5. private static void paintMaze(int[][] maze) {
  6. //1表示墙
  7. for (int i = 0; i < 10; i++) {
  8. maze[0][i] = 1;
  9. maze[9][i] = 1;
  10. maze[i][0] = 1;
  11. maze[i][9] = 1;
  12. }
  13. //随机设置障碍
  14. Random random = new Random();
  15. for (int i = 0; i < 20; i++) {
  16. maze[random.nextInt(9)][random.nextInt(9)] = 1;
  17. }
  18. //起点1,1 终点8,8 确保为0
  19. maze[1][1] = 0;
  20. maze[8][8] = 0;
  21. }

打印迷宫

  1. /**
  2. * 打印迷宫
  3. * @param maze
  4. */
  5. private static void print(int[][] maze) {
  6. for (int[] arr : maze) {
  7. for (int i : arr) {
  8. System.out.print(i + " ");
  9. }
  10. System.out.println();
  11. }
  12. }

走迷宫

  1. /**
  2. * 递归回溯走迷宫
  3. * 策略 右→下→左→上
  4. * 1:墙
  5. * 2:可行
  6. * 3:死路
  7. * @param maze
  8. * @param i 当前横坐标
  9. * @param j 当前纵坐标
  10. * @return
  11. */
  12. private static boolean go(int[][] maze, int i, int j) {
  13. if (maze[8][8] == 2) {
  14. return true;
  15. }
  16. if (maze[i][j] == 0) {
  17. maze[i][j] = 2;
  18. // 右→下→左→上
  19. if (go(maze, i, j + 1) || go(maze, i - 1, j) || go(maze, i, j - 1) || go(maze, i + 1, j)) {
  20. return true;
  21. }
  22. maze[i][j] = 3;
  23. }
  24. return false;
  25. }

测试

  1. public static void main(String[] args) {
  2. //二维数据模拟迷宫
  3. int[][] maze = new int[10][10];
  4. paintMaze(maze);
  5. print(maze);
  6. System.out.println(go(maze, 1, 1));
  7. print(maze);
  8. }

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,74人围观)

还没有评论,来说两句吧...

相关阅读