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日

相关文章

  • Win10预览版9860自制ISO镜像下载

    Win10预览版9860自制ISO镜像下载攻略 本攻略将详细介绍如何下载Win10预览版9860的自制ISO镜像。请按照以下步骤进行操作: 步骤一:准备工作 在开始之前,请确保您已经完成以下准备工作: 确保您的计算机已经安装了合适的操作系统和软件,以便进行下载和制作ISO镜像。 确保您的计算机已经连接到互联网,并且网络连接稳定。 步骤二:查找可靠的下载源 在…

    other 2023年8月3日
    00
  • VS2019 安装时闪退的解决方法

    当我们在安装Visual Studio 2019时,可能会遇到意外的闪退问题。这个问题可能会发生在安装的过程中或者是在Visual Studio 2019启动的时候。那么如何解决这个问题呢?下面就来详细讲解一下。 步骤一:查看错误日志 当我们遇到Visual Studio 2019安装、启动闪退时,第一步应该是查看错误日志。错误日志能够帮助我们确认闪退的具体…

    other 2023年6月27日
    00
  • 企业红帽Linux7的10个特性分析

    企业红帽Linux7的10个特性分析 1. 改进的内核性能与稳定性 企业红帽Linux 7采用了Linux 3.10内核,通过减少不必要的系统调用等方式来提高系统性能。此外,还对CPU、内存等方面进行了优化,极大地提高了系统的稳定性和响应速度。例如,可以通过以下命令查看CPU信息: $ cat /proc/cpuinfo 2. 灵活的文件系统选项 企业红帽L…

    other 2023年6月28日
    00
  • mysql区间范围查询问题

    以下是“MySQL区间范围查询问题的完整攻略”的标准markdown格式文本,其中包含两个示例: MySQL区间范围查询问题的解决方法 MySQL中,我们经常需要进行区间范围查询,例如查询某个时间段内的数据、查询某个价格区间内的商品等。但是,在进行区间范围查询时,我们需要注意一些问题,以避免查询结果不准确或者查询效率低下。以下是MySQL区间范围查询问题的解…

    other 2023年5月10日
    00
  • Vue+ElementUI 中级联选择器Bug问题的解决

    下面是详细的讲解“Vue+ElementUI 中级联选择器Bug问题的解决”的攻略: 问题描述 在使用Vue+ElementUI的级联选择器时,如果选中一个子级,父级的选择器就会被清空。 Bug分析 原因是因为使用Vue时,子组件变更会逐级向上传递,会触发父组件的更新,导致父组件的数据被清空。 解决方案 在使用级联选择器时,我们需要在父组件设置子组件的值时,…

    other 2023年6月27日
    00
  • 8代酷睿Coffee Lake首测 Intel i5 8250U移动CPU处理器性能对比评测

    8代酷睿Coffee Lake首测 Intel i5-8250U移动CPU处理器性能对比评测攻略 1. 硬件配置和测试环境准备 在进行性能对比评测之前,我们需要准备以下硬件配置和测试环境: 一台搭载Intel i5-8250U移动CPU的笔记本电脑 操作系统:Windows 10 测试软件:CPU-Z、Cinebench、Geekbench等 2. 测试方法…

    other 2023年10月16日
    00
  • go-在类型切换中使用strconv.formatfloat()遇到问题

    go-在类型切换中使用strconv.FormatFloat()遇到问题的完整攻略 在Go语言中,类型切换是一种常见的操作。在类型切换过程中,我们有时需要将浮点数转换为字符串。这时,我们可以使用strconv.FormatFloat()函数。然而,在使用这个函数时,有时会遇到一些问题。本文将提供一个完整的攻略,帮助您解这些问题。 问题描述 在Go语言中,我们…

    other 2023年5月8日
    00
  • iOS13.2.2正式版固件下载地址 iOS13.2.2正式版下载

    iOS13.2.2正式版固件下载地址 iOS13.2.2正式版下载攻略 iOS13.2.2正式版是苹果公司最新发布的操作系统版本,它带来了一些修复和改进。如果你想下载并安装这个版本,下面是一个详细的攻略。 步骤一:备份你的设备 在开始下载和安装iOS13.2.2之前,强烈建议你先备份你的设备。这样可以确保你的数据在升级过程中不会丢失。你可以通过iCloud或…

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