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

yizhihongxing

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日

相关文章

  • Spring核心之IOC与bean超详细讲解

    当然!下面是关于\”Spring核心之IOC与Bean超详细讲解\”的完整攻略,包含两个示例说明。 … … … … … … … … … … … … … … … … … … … … … … … … … … … … … … … … ..…

    other 2023年8月20日
    00
  • 微信小程序自定义顶部组件customHeader的示例代码

    下面我将为您详细讲解微信小程序自定义顶部组件customHeader的示例代码的完整攻略。 1. 前言 微信小程序的customComponent是一个非常实用的功能,它能让我们自定义一些重复使用的组件,如自定义顶部组件customHeader。自定义顶部组件有许多的应用场景,比如可以在不同页面中使用同一种顶部样式,这样既能提高效率,也能让应用界面看起来更加…

    other 2023年6月25日
    00
  • 页面加载完后自动执行一个方法的js代码

    想要在页面加载完后自动执行一个方法,可以使用JavaScript中的window.onload事件。当页面所有元素均已加载完成时,该事件会触发自定义的函数。以下是实现这个功能的完整攻略: 创建JavaScript函数:在JS文件中定义一个需要在页面加载完成后自动执行的函数。 function onLoadFunction() { // your code }…

    other 2023年6月25日
    00
  • 原生js实现自定义滚动条组件

    下面是“原生js实现自定义滚动条组件”的完整攻略: 1.需求分析 首先需要明确我们要实现什么,即自定义滚动条组件应该具备以下功能: 拥有滚动条,可以实现滚动内容; 拥有上下箭头和滑块,可以通过拖拽滑块或点击箭头实现滚动; 拥有水平和垂直两种滚动方式,可以根据需要选择滚动的方向。 基于上述需求,我们可以先实现一个基础版的自定义滚动条组件,然后再逐步添加更多的功…

    other 2023年6月25日
    00
  • Spring注解驱动之BeanPostProcessor后置处理器讲解

    Spring注解驱动之BeanPostProcessor后置处理器讲解 简介 在 Spring 容器中,BeanPostProcessor 是 Bean 工厂级别的拦截器接口。当一个 Bean 对象在容器实例化、配置和其他初始化工作完成后,以及它依赖的其他 Bean 对象都已经完全初始化后,Spring 容器允许 BeanPostProcessor 对象对该…

    other 2023年6月27日
    00
  • 为eclipseee(汉化版)配置tomcat服务器

    以下是关于“为Eclipse(汉化版)配置Tomcat服务器”的完整攻略: Eclipse简介 Eclipse是一款开源的集成开发环境(IDE),可以用开发Java、C++、Python多种编程语言。Eclipse支持多种件,可以通过插件扩展来实现多的功能。 Tomcat简介 Tomcat一款开源的Web服务器和Servlet容器,可以用运行Java Web…

    other 2023年5月9日
    00
  • 64位win10系统无法安装.Net framework3.5的两种解决方法

    下面是关于“64位win10系统无法安装.Net framework3.5的两种解决方法”的完整攻略。 问题描述 在64位的Win10系统下,有时候会出现无法安装.Net framework3.5的情况。此时,用户可能会遇到类似于以下错误提示: 无法安装.NET Framework 3.5 .NET Framework 3.5安装程序出现了一个错误。 解决方…

    other 2023年6月26日
    00
  • 易语言数据库的“取库文件名”命令详解

    易语言数据库的“取库文件名”命令详解 在使用易语言的数据库操作时,需要使用到“取库文件名”命令来获取数据库文件的文件名,以便对其进行操作。下面详细讲解这个命令的使用方法和注意事项。 命令语法 取库文件名(库名称, 类型) 其中,库名称为字符串类型,表示要操作的数据库文件名;类型为整数类型,取值范围为0到2,表示返回的文件名类型,具体取值及含义如下: 0:返回…

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