代码魔法:递归嵌套的《迷宫之旅》算法解析

news2024/11/24 4:33:13

前言

在代码的舞台上,递归算法的奇迹就如同魔法一般令人叹为观止。本文以经典的迷宫问题为基础,通过递归嵌套的方式,带你踏上一场神奇的迷宫之旅。

迷宫规则

迷宫由一个二维数组表示,其中0表示可通行的路径,1表示墙壁,2表示已经访问过的路径。起点位于左上角(0, 0),终点位于右下角(N-1, N-1),N为迷宫的大小。任务是找到从起点到终点的路径。

代码魔法

import java.util.ArrayList;
import java.util.List;
/**
 * 迷宫规则
 * 迷宫由一个二维数组表示,其中0表示可通行的路径,1表示墙壁,2表示已经访问过的路径。起点位于左上角(0, 0),终点位于右下角(N-1, N-1),N为迷宫的大小。任务是找到从起点到终点的路径。
 */
public class MagicMaze {
    public static void main(String[] args) {
        int[][] maze = {
                {0, 0, 1, 0, 0, 0, 0, 0},
                {1, 0, 1, 0, 1, 1, 1, 0},
                {0, 0, 0, 0, 1, 0, 0, 0},
                {1, 1, 1, 0, 1, 0, 1, 1},
                {0, 0, 0, 0, 0, 0, 1, 0},
                {0, 1, 0, 1, 1, 1, 1, 0},
                {1, 0, 0, 0, 0, 0, 0, 0},
                {0, 1, 1, 1, 1, 1, 1, 0}
        };

        // 开始迷宫之旅
        List<int[]> path = solveMaze(maze, 0, 0, new ArrayList<>());

        // 输出结果
        System.out.println("是否找到唯一路径:" + (path != null));
        if (path != null) {
            System.out.println("唯一路径的路线:");
            for (int i = 0; i < path.size(); i++) {
                int[] point = path.get(i);
                System.out.print("(" + point[0] + ", " + point[1] + ")");
                if (i < path.size() - 1) {
                    System.out.print(" -> ");
                }
            }
        }
    }

    // 迷宫求解的递归算法,返回唯一路径的路线
    private static List<int[]> solveMaze(int[][] maze, int x, int y, List<int[]> currentPath) {
        int N = maze.length;

        // 到达目标位置
        if (x == N - 1 && y == N - 1) {
            List<int[]> finalPath = new ArrayList<>(currentPath);
            finalPath.add(new int[]{x, y});
            return finalPath;
        }

        // 判断当前位置是否合法
        if (x >= 0 && y >= 0 && x < N && y < N && maze[x][y] == 0) {
            // 标记当前位置已访问
            maze[x][y] = 2;

            // 尝试向下、向右、向上、向左探索
            List<int[]> newPath = solveMaze(maze, x + 1, y, currentPath);
            if (newPath == null) newPath = solveMaze(maze, x, y + 1, currentPath);
            if (newPath == null) newPath = solveMaze(maze, x - 1, y, currentPath);
            if (newPath == null) newPath = solveMaze(maze, x, y - 1, currentPath);

            // 如果找到路径,返回
            if (newPath != null) {
                newPath.add(0, new int[]{x, y});
                return newPath;
            }

            // 如果上述方向均无法到达目标,回溯,取消标记
            maze[x][y] = 0;
        }

        return null;
    }
}

在这里插入图片描述

通过这段代码,我们模拟了一场8x8的迷宫之旅。在这个迷宫中,我们成功找到了一条唯一的路径,通过递归嵌套的方式,实现了从起点到终点的深度搜索,并返回了这条唯一路径的路线。这不仅是一次代码的探险,更是对递归算法的深度体验。

总结

在实际应用中,这样的代码奇迹具有广泛的应用价值,尤其在路径搜索问题中。递归算法展现了其奇妙之处,通过简洁而有效的解决方案,让我们能够在编码的世界中探索未知。这样的深度搜索不仅让编程更具挑战性,同时也为解决复杂问题提供了一种独特而强大的思维工具。

总之,这次迷宫之旅不仅是代码的奇妙演绎,更是对递归思想和深度搜索精髓的一次呈现。它为编码的世界增添了神秘的色彩,让我们在解决问题的道路上不断探索、不断前行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1321753.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

泛型(泛型类、接口及方法)——学习推荐版,通俗易懂讲解

泛型定义及分类 1.泛型类 类型变量其实就是一个标识符&#xff0c;一般用大写字母表示&#xff0c;如K&#xff0c;T&#xff0c;E&#xff0c;V&#xff0c;当然也可以多个字母或数字的组合&#xff0c;只要满足标识符的定义规则就都可以。 形式1 若写成MyArrayList<> …

UE5 C++(六)— 枚举UENUM、结构体USTRUCT和补充属性说明符

文章目录 枚举&#xff08;ENUM&#xff09;第一种方式第二种方式 结构体&#xff08;USTRUCT&#xff09;补充属性说明符&#xff08;ExposeOnSoawn&#xff09;结构体创建数据表格 枚举&#xff08;ENUM&#xff09; 第一种方式 定义枚举 UENUM(BlueprintType) namespace …

Vue中英文翻译小结

背景&#xff1a;时局艰难&#xff0c;后端开发被强制写了vue&#xff0c;这不有个需求是中英文翻译&#xff0c;特此记录下&#xff0c;该怎么个翻译法子。 先引入全局的路由国际化文件&#xff0c;zh.js 和 en.js 1.关于插值表达Button里面 {{ $t(reinsop.common.back) }} …

制造业CRM选型注意事项:有这些功能的系统更好用

当前&#xff0c;推动制造业数字化转型已成时代发展趋势。为了适应这一趋势&#xff0c;制造业使用CRM管理系统是非常重要的。那么&#xff0c;制造业CRM应该怎么选&#xff1f; 1、全方位客户管理 订单价值大&#xff0c;交货周期长&#xff0c;客户开发难。。。这一直是制造…

MySQL job 定时任务

目录 介绍 优点&#xff1a; 缺点&#xff1a; 使用场景&#xff1a; 案例 创建表 -- 创建定时任务 每一分钟插入一条数据 执行结果 -- 查询定时任务 ENABLED--启用 DISABLED--禁用 -- 查询定时任务 -- 启用定时任务 ​-- 禁用定时任务 ​-- 删除定时任务 …

Unity | 渡鸦避难所-3 | 控制角色移动

1 移动刚体 在物理世界中&#xff0c;控制刚体移动通常有三种方式&#xff0c;每种方式产生的效果也不尽相同 AddForce&#xff1a;添加作用力&#xff0c;用于模拟真实的物理效果 MovePosition&#xff1a;设置位置&#xff0c;用于精确控制游戏对象的位置 velocity&#x…

opencv 入门一(显示一张图片)

头文件添加如下&#xff1a; 库目录添加如下&#xff1a; 依赖的库如下&#xff1a; #include <iostream> #include "opencv2/opencv.hpp" int main(int argc,char ** argv) { cv::Mat img cv::imread(argv[1], -1); if (img.empty()) return -1; …

1998-2022年最大NDVI数据集(1km)

本文的植被指数&#xff08;NDVI&#xff09;数据来源于美国NASA定期发布的MOD13A3植被指数数据集。MOD13A3提供自1998年4月起逐月1km的NDVI数据。原始数据来源详细的介绍见&#xff1a;https://doi.org/10.5067/MODIS/MOD13A3.006   月度NDVI数据为每月1-3旬NDVI数据数值的最…

第二证券:耐心等待指数企稳 关注数据要素等板块

其时或是布局商场的时间窗口。2024年美联储或打开降息周期&#xff0c;欧洲降息预期也在增强&#xff0c;全球流动性有望迎来拐点。中心经济工作提及2024年的职业及工业方向&#xff0c;政策有望落地施行&#xff0c;将会为职业配备带来较多的催化要素&#xff0c;是具备配备价…

小红书可观测 Metrics 架构演进,如何实现数十倍性能提升?

在当前云原生时代&#xff0c;随着微服务架构的广泛应用&#xff0c;云原生可观测性概念被广泛讨论。可观测技术建设&#xff0c;将有助于跟踪、了解和诊断生产环境问题&#xff0c;辅助开发和运维人员快速发现、定位和解决问题&#xff0c;支撑风险追溯、经验沉淀、故障预警&a…

Android WorkManager入门(一)

WorkManager入门 前言一、WorkManager是什么&#xff1f;二、使用1.添加依赖2.定义工作3.创建 WorkRequest并提交 一次性的任务&#xff08;OneTimeWorkRequest&#xff09;4.setExpedited 加急方法5. setInitialDelay 延时任务6.约束 总结参考资料 前言 在当今快节奏的生活中…

协同物联:设备物联与车间数据采集的融合

随着工业4.0和智能制造的快速发展&#xff0c;物联网技术在工业领域的应用逐渐普及。其中&#xff0c;协同物联、设备物联和车间数据采集技术对于提升企业生产效率和降低运营成本具有重要意义。本文将深入探讨这些技术在现代工业环境中的应用及它们如何共同推动企业向数字化转型…

【Linux基础】3. 文件基本属性

文章目录 【 1. 文件的属主和属组 】【 2. 显示文件的类型、权限 】2.1 文件类型2.2 文件权限 【 3. 更改文件属性 】3.1 chgrp 更改文件属组3.2 chown 更改文件所有者3.3 更改文件权限3.3.1 数字法更改文件权限3.3.2 符号法更改文件权限 【 1. 文件的属主和属组 】 Linux 系统…

山海鲸开发者带你看:智慧医疗解决方案

在之前的文章中我为大家介绍了山海鲸可视化软件的一些基础操作以及一些解决方案&#xff0c;让大家知道了山海鲸可视化软件是一款可以免费自由开发的数字孪生软件。在本文&#xff0c;我将带大家了解山海鲸可视化的智慧医疗解决方案&#xff0c;让大家知道山海鲸可视化能在医疗…

maui中实现加载更多 RefreshView跟ListView(2)

一个类似商品例表的下拉效果&#xff1a; 代码 新增个类为商品商体类 public class ProductItem{public string ImageSource { get; set; }public string ProductName { get; set; }public string Price { get; set; }}界面代码&#xff1a; <?xml version"1.0&quo…

现代化智慧档案馆八防十防建设调研样本

以下是一份完整的解决方案&#xff0c;包括方案介绍、方案优势、实施方案、预算和清单、实施时间和进度计划以及可能遇到的难点和解决方案。 方案介绍 档案库房八防十防环境一体化监控系统旨在为档案库房提供全方位的环境监控和管理&#xff0c;保障档案的安全、稳定和可靠。该…

C++前后函数的相互调用,函数的预定义,靠前的函数调用靠后的函数

好多时候我们习惯性的认为在C中函数的定义是没有顺序的关系的&#xff0c;如下所示 代码片段1 void func1() {cout << "func1" << "\n"; } void func2() {cout << "func2" << "\n"; }代码片段2 void fun…

浅析PAM市场价值

随着全球数字化蓬勃发展&#xff0c;云计算、人工智能、大数据、5G等技术的应用范围不断扩大&#xff0c;在企业运用新技术提高自身效率的同时也面临着更多由新技术诱发的网络威胁&#xff0c;全球网络威胁形势愈发严峻。网络攻击行为日趋复杂&#xff0c;构建全面的安全防护体…

端口占用命令 netstat (centos)+netstat (windows)

linux 1.使用 netstat 命令查看端口占用情况 netstat -tlnp 使用 -p 选项查看进程信息。 使用 -t 选项列出 TCP 协议的连接&#xff1a;类似&#xff08;使用 -u 选项列出 UDP 协议的连接&#xff1a;&#xff09; 2.查找占用指定端口号的应用信息 netstat -tlnp | grep 3…

基于SSM的高校疫情防控出入信息管理系统的设计与实现论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本高校疫情防控出入信息管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞…