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日

相关文章

  • windows安装xtrabackup

    什么是XtraBackup? XtraBackup是一个由Percona发的免费、开源的MySQL备份工具,它可以在不停止MySQL服务器的情况下备份InnoDB和XtraDB存储引擎的数据。 如何在Windows上安装XtraBackup? 以下是在Windows上安装XtraBackup的步骤: 下载XtraBackup。 您可以从Percona的官方网…

    other 2023年5月7日
    00
  • adbdevices找不到设备的解决方法

    简介 在使用Android Debug Bridge (ADB)连接Android设备时,有时会出现adb devices找不到设备的情况。在本攻略中,我们将介绍如何解决adb devices找不到设备的问题,并提两个示例说明。 步骤 以下是解决adb devices找不到设备的步骤。 步骤1:检查设备连接 首先,我们需要检查设备是否正确连接到计算机。我们可…

    other 2023年5月6日
    00
  • 如何打开或者运行一个程序?关于运行程序相关的基础知识

    如何打开或者运行一个程序? 打开或者运行一个程序是计算机中最基础的操作之一。下面我们将详细讲解如何在Windows和Mac OS操作系统下打开或者运行一个程序,以及相关的基础知识。 Windows操作系统下打开或者运行程序 Windows操作系统是目前应用最广泛的操作系统之一。下面我们将以Windows 10操作系统为例,讲解如何打开或者运行一个程序。 通过…

    other 2023年6月25日
    00
  • mac平台下部署ue4工程到ios设备的流程

    mac平台下部署ue4工程到ios设备的流程 如果你想在Mac平台上部署UE4工程到iOS设备上,那么你需要遵循以下步骤: 步骤一:安装 MacOS 平台和 Unreal Engine 4 首先,确保你的Mac电脑上已安装了最新版本的macOS。同时,你也需要确保你安装了最新版本的Unreal Engine 4(UE4)。如果你还没有安装UE4,你可以通过以…

    其他 2023年3月29日
    00
  • Python栈的实现方法示例【列表、单链表】

    下面我将详细讲解Python栈的实现方法,包括列表和单链表两种方法。 什么是栈? 在开始讲解栈的实现方法之前,我们需要先了解什么是栈。栈(Stack)是一种先进后出的数据结构,它只允许在一端进行插入和删除操作,这一端通常称为栈顶。栈被广泛应用于计算机中,例如函数调用、表达式求值、括号匹配等。 列表实现栈 在Python中,可以使用列表(list)来实现栈。列…

    other 2023年6月27日
    00
  • 解析之C++的列表初始化语法

    当我们使用C++时,列表初始化语法可以用于创建和初始化各种类型的对象,包括数组、结构体、类和STL容器等。下面是解析C++列表初始化语法的完整攻略: 1. 列表初始化的语法 在C++ 11标准之后,我们可以使用以下方式进行列表初始化: <type> <name> = {<value1>, <value2>, .…

    other 2023年6月20日
    00
  • 十个你必须要会的TypeScript技巧分享

    十个你必须要会的 TypeScript 技巧分享 TypeScript 是一种强类型的 JavaScript 超集,它提供了更好的代码可读性、可维护性和可靠性。下面是十个你必须要会的 TypeScript 技巧,它们将帮助你更好地使用 TypeScript。 1. 类型推断 TypeScript 可以根据变量的赋值自动推断出变量的类型。这样可以减少代码中的类…

    other 2023年7月29日
    00
  • mysql链接字符串

    以下是详细讲解“MySQL链接字符串的完整攻略”的标准Markdown格式文本: MySQL链接字符串的完整攻略 MySQL是一种常用的关系型数据库,连接MySQL数据库需要使用链接字符串。本攻略将介绍如何构建链接字符串。 MySQL链接字符串的基本格式 MySQL链接字符串的基本格式如下: mysql://[username[:password]@][ho…

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