Java递归寻路实现,你真的理解了吗

Java递归寻路实现,你真的理解了吗

什么是递归寻路

递归寻路是指在迷宫等场景下,从起点开始,不断地试探路径并标记已经探测的路径,直到找到终点或是所有可达路径都已探测过的过程。

实现思路

在 Java 中,可以通过递归函数来实现寻路的过程。具体来说,我们可以编写下面这个函数 findPath

public static boolean findPath(int x, int y, int[][] maze, int[][] path) {
    if (x < 0 || x >= maze.length || y < 0 || y >= maze[0].length || maze[x][y] == 1 || path[x][y] == 1) {
        // 如果越界了,或是碰到了障碍,或是已经在当前路径上,返回 false
        return false;
    }
    if (x == maze.length - 1 && y == maze[0].length - 1) {
        // 如果已经到达终点,返回 true
        return true;
    }
    path[x][y] = 1;  // 标记当前位置已经探测过
    // 在当前位置的上、下、左、右四个方向递归查找路径
    if (findPath(x, y - 1, maze, path) || findPath(x - 1, y, maze, path) || 
        findPath(x, y + 1, maze, path) || findPath(x + 1, y, maze, path)) {
        return true;
    }
    path[x][y] = 0;  // 如果当前位置没有通行,将其标记为未探测过,以便后续查找可以重新探测
    return false;
}

在该函数中,我们传入了起点的坐标 (x, y)、迷宫数组 maze 和路径数组 path。迷宫数组中的 0 表示通行,1 表示障碍,路径数组中的 0 表示未探测,1 表示已探测。函数返回值为是否找到终点的布尔值。

在函数中,我们首先进行参数的检查,如果越界或碰到障碍或已在路径上,则返回 false。然后,检查是否已到达终点,如果是,返回 true。接着,在当前位置的上、下、左、右四个方向递归调用 findPath 函数,如果有一个方向能够找到终点,就返回 true。最后,将当前位置标记为未探测过,并返回 false。

示例1

假设有一个如下所示的迷宫:

01110
00000
11111
00110
01000

其中 0 表示通行,1 表示障碍。起点为 (0, 0),终点为 (4, 3)。我们可以通过下面这段代码来寻路:

int[][] maze = {{0, 1, 1, 1, 0},
                {0, 0, 0, 0, 0},
                {1, 1, 1, 1, 1},
                {0, 0, 1, 1, 0},
                {0, 1, 0, 0, 0}};
int[][] path = new int[maze.length][maze[0].length];
if (findPath(0, 0, maze, path)) {
    System.out.println("找到了一条路径:");
    for (int i = 0; i < path.length; i++) {
        for (int j = 0; j < path[0].length; j++) {
            System.out.print(path[i][j] == 1 ? "●" : "○");
        }
        System.out.println();
    }
} else {
    System.out.println("没有找到路径!");
}

该代码输出的结果为:

找到了一条路径:
●○○○○
●●●●○
○○○○●
○○●●●
○○○●○

我们可以看到,除了障碍以外,路径上的所有格子都被标记为 1,表示已探测过的路径。

示例2

下面是另一个迷宫的例子:

0011010
0001011
0110001
1100100
0010111
1010001

起点为 (0, 0),终点为 (5, 6)。同样可以通过下面的代码来寻路:

int[][] maze2 = {{0, 0, 1, 1, 0, 1, 0},
                 {0, 0, 0, 1, 0, 1, 1},
                 {0, 1, 1, 0, 0, 0, 1},
                 {1, 1, 0, 0, 1, 0, 0},
                 {0, 0, 1, 0, 1, 1, 1},
                 {1, 0, 1, 0, 0, 0, 1}};
int[][] path2 = new int[maze2.length][maze2[0].length];
if (findPath(0, 0, maze2, path2)) {
    System.out.println("找到了一条路径:");
    for (int i = 0; i < path2.length; i++) {
        for (int j = 0; j < path2[0].length; j++) {
            System.out.print(path2[i][j] == 1 ? "●" : "○");
        }
        System.out.println();
    }
} else {
    System.out.println("没有找到路径!");
}

运行结果为:

找到了一条路径:
●●○○○○●
○●○○○○●
○●●○○●●
●●●○●○○
○○●○●●●
●○●○○○●

同样可以看到,除了障碍以外,路径上的所有格子都被标记为 1,表示已探测过的路径。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java递归寻路实现,你真的理解了吗 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 深入解析C++编程中的运算符重载

    深入解析C++编程中的运算符重载 在C++中,运算符重载可以让我们自定义运算符的行为,让其适用于自定义类和数据类型。以下是深入解析C++编程中运算符重载的完整攻略。 1. 进行运算符重载 运算符重载是通过定义特殊类型的函数来实现的,这些函数的名称是由运算符自己确定的。例如,运算符+的重构函数应该被命名为operator+。下面是一个重载运算符+的例子: cl…

    other 2023年6月27日
    00
  • 电脑的内存太少的解决办法

    电脑的内存太少的解决办法 简介 电脑的内存不足可能导致系统运行缓慢、应用程序崩溃等问题。解决这个问题的方法有很多,下面将详细介绍几种常见的解决办法。 解决办法一:增加物理内存 增加电脑的物理内存是解决内存不足问题的最直接方法。以下是具体步骤: 确定电脑的内存类型和最大支持容量:打开电脑的系统信息或者查看电脑的用户手册,找到内存类型和最大支持容量的信息。 购买…

    other 2023年8月1日
    00
  • 变量、函数、类的命名规则

    下面是变量、函数、类的命名规则的完整攻略。 变量的命名规则 变量的命名要符合以下规则: 变量名必须以字母或下划线(_)开头。 变量名只能包含字母、数字和下划线(_),不能包含其他字符。 变量名不能以数字开头。 变量名应该使用小写字母,并且采用下划线分割单词,以提高可读性。 例如: # 正确的变量命名 x = 1 name = "Jack"…

    other 2023年6月27日
    00
  • 服务名无效。请键入nethelpmsg2185以获得更多的帮助。

    服务名无效。请键入nethelpmsg2185以获得更多的帮助。 在使用Windows Server操作系统时,有时会出现”服务名无效。请键入nethelpmsg2185以获得更多的帮助。”的错误提示。这个错误提示通常是由于服务名拼写错误或服务未启动导致的。 常见的解决方法包括以下几种: 检查服务名拼写 如果出现该错误提示,首先需要检查服务名是否拼写正确。确…

    其他 2023年3月29日
    00
  • C语言数据结构中堆排序的分析总结

    C语言数据结构中堆排序的分析总结 堆排序的基本思路 堆排序(Heap Sort)是利用堆这种数据结构而设计的一种排序算法,堆排序是选择排序的一种。堆排序分为两种方法,分别是大根堆排序和小根堆排序。下面以大根堆排序为例讲解堆排序的基本思路。 将初始待排序关键字序列(R1,R2….Rn)构建成大根堆,此堆为初始的无序区。 将堆顶元素R[1]与最后一个元素R[…

    other 2023年6月27日
    00
  • Golang全局变量加锁的问题解决

    Golang全局变量加锁的问题解决攻略 在Go语言中,全局变量的并发访问可能会导致数据竞争和不确定的结果。为了解决这个问题,我们可以使用互斥锁(Mutex)来保护全局变量的访问。本攻略将详细介绍如何使用互斥锁来解决全局变量加锁的问题,并提供两个示例说明。 1. 创建互斥锁 首先,我们需要创建一个互斥锁来保护全局变量的访问。Go语言提供了sync包来支持互斥锁…

    other 2023年7月29日
    00
  • vivo手机怎么清理系统内存?vivo手机清理存储空间方法

    vivo手机清理系统内存攻略 清理系统内存可以帮助vivo手机提高性能和运行速度。下面是一些清理系统内存的方法: 方法一:关闭后台应用程序 关闭后台应用程序可以释放系统内存并提高手机性能。请按照以下步骤进行操作: 在vivo手机上,打开最近使用的应用程序列表。通常可以通过导航栏上的方形图标或者从底部向上滑动屏幕来打开该列表。 在最近使用的应用程序列表中,浏览…

    other 2023年8月1日
    00
  • 在centos docker中安装nvidia驱动

    在CentOS Docker中安装NVIDIA驱动的完整攻略如下: 确认系统环境 在安装NVIDIA驱动之前,需要确认系统环境是否满足要求。首先,需要确认系统中是否已经安装了Docker和NVIDIA驱动所需的内核模块。可以通过以下命令来确认: $ uname -r 如果输出的内核版本号为3.10或以上,并且已经安装了Docker和NVIDIA驱动所需的内核…

    other 2023年5月5日
    00
合作推广
合作推广
分享本页
返回顶部