JAVA 解决迷宫问题

有一个迷宫,1是墙壁不可走,0是可以走的路.从入口出发,规定只能通过向上、向下、向左和向右方向进行走动,问如何才能找到一条到达出口的通路。{1, 1, 1, 1, 1, 1, 1, 1, 1},{0, 0, 1, 0, 0, 0, 1, 1, 1},{1, 0, 1, 1, 1, 0, 1, 1, 1},{1, 0, 0, 1, 0, 0, 1, 1, 1},{1, 1, 0, 1, 1, 0, 0, 0, 1},{1, 0, 0, 0, 0, 0, 1, 0, 1},{1, 0, 1,
摘要由CSDN通过智能技术生成

有一个迷宫,1是墙壁不可走,0是可以走的路.从入口出发,规定只能通过向上、向下、向左和向右方向进行走动,问如何才能找到一条到达出口的通路。

{1, 1, 1, 1, 1, 1, 1, 1, 1},
{0, 0, 1, 0, 0, 0, 1, 1, 1},
{1, 0, 1, 1, 1, 0, 1, 1, 1},
{1, 0, 0, 1, 0, 0, 1, 1, 1},
{1, 1, 0, 1, 1, 0, 0, 0, 1},
{1, 0, 0, 0, 0, 0, 1, 0, 1},
{1, 0, 1, 1, 1, 0, 0, 0, 1},
{1, 1, 0, 0, 0, 0, 1, 0, 0},
{1, 1, 1, 1, 1, 1, 1, 1, 1}

创建一个相同大小的二维布尔类型数组,如果走过改写为true

当每走过一个位置后,把改位置的值标记为-1,如果该位置标记为false,则不可以重复走

判断当前位置是否有路可走,根据向右、向下、向左、向上的顺序判断该位置的下一步是否有路可走

每走一步,需要把每一步的位置坐标保存起来,记录走过的位置

当走到死胡同,没路可走时,回溯到前面的位置,并判断该位置是否有路可走

如果有路可走,则继续往下走,反之则继续回退到前面一个位置继续查找,直到找到有路可走为止
 

代码实现:

public class Maze {
    private static int[][] maze = {
            {1, 1, 1, 1, 1, 1, 1, 1, 1},
            {0, 0, 1, 0, 0, 0, 1, 1, 1},
            {1, 0, 1, 1, 1, 0, 1, 1, 1},
            {1, 0, 0, 1,
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回溯算法可以很好地解决迷宫问题。下面是一个Java实现的示例代码: ```java import java.util.*; public class Maze { private int[][] maze; // 迷宫矩阵 private int rows; // 行数 private int cols; // 列数 private int startX; // 起点横坐标 private int startY; // 起点纵坐标 private int endX; // 终点横坐标 private int endY; // 终点纵坐标 private boolean[][] visited; // 记录走过的位置 public Maze(int[][] maze, int startX, int startY, int endX, int endY) { this.maze = maze; this.rows = maze.length; this.cols = maze[0].length; this.startX = startX; this.startY = startY; this.endX = endX; this.endY = endY; this.visited = new boolean[rows][cols]; } public void solve() { List<int[]> path = new ArrayList<>(); // 记录路径 boolean found = backtrack(startX, startY, path); if (found) { System.out.println("Solution found:"); for (int[] p : path) { System.out.print(Arrays.toString(p) + " "); } } else { System.out.println("No solution found."); } } private boolean backtrack(int x, int y, List<int[]> path) { if (x == endX && y == endY) { path.add(new int[]{x, y}); return true; } if (maze[x][y] == 1 || visited[x][y]) { return false; } path.add(new int[]{x, y}); visited[x][y] = true; if (x > 0 && backtrack(x - 1, y, path)) { return true; } if (x < rows - 1 && backtrack(x + 1, y, path)) { return true; } if (y > 0 && backtrack(x, y - 1, path)) { return true; } if (y < cols - 1 && backtrack(x, y + 1, path)) { return true; } path.remove(path.size() - 1); // 回溯 return false; } public static void main(String[] args) { int[][] maze = { {0, 1, 0, 0}, {0, 0, 0, 1}, {1, 0, 0, 0}, {1, 1, 0, 0}, {1, 1, 1, 0} }; Maze m = new Maze(maze, 0, 0, 4, 3); m.solve(); } } ``` 在这个示例代码中,我们使用了递归的回溯算法来解决迷宫问题。当我们到达终点时,将路径添加到路径列表中并返回true。否则,我们按照上、下、左、右的顺序依次探索可行的路径。如果找到了一条可行路径,则返回true。如果所有的路径都无法到达终点,则回溯到上一步并返回false。最后,我们将找到的路径打印出来。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值