【NOI-题解】1431. 迷宫的第一条出路

文章目录

  • 一、前言
  • 二、问题
    • 问题:1431. 迷宫的第一条出路
  • 三、感谢

一、前言

二、问题

问题:1431. 迷宫的第一条出路

类型:深度搜索、回溯、路径打印


题目描述:

已知一 N×N 的迷宫,允许往上、下、左、右四个方向行走,现请你按照左、上、右、下顺序进行搜索,找出第一条从左上角到右下角的路径。

输入:

输入数据有若干行,第一行有一个自然数 N(N≤20),表示迷宫的大小;
其后有 N 行数据,每行有 N 个 0 或 1(数字之间没有空格,0 表示可以通过,1 表示不能通过),用以描述迷宫地图。入口在左上角 (1,1)处,出口在右下角(N,N) 处。
所有迷宫保证存在从入口到出口的可行路径。

输出:

输出数据仅一行,为按照要求的搜索顺序找到的从入口到出口的第一条路径(搜索顺序:左、上、右、下)。

样例:

输入:

4
0001
0100
0010
0110

输出:

(1,1)->(1,2)->(1,3)->(2,3)->(2,4)->(3,4)->(4,4)

在这里插入图片描述


1.分析问题

  1. 已知:N×N 的迷宫,允许往上、下、左、右四个方向行走。
  2. 未知:按照左、上、右、下顺序进行搜索,找出第一条从左上角到右下角的路径。
  3. 关系:深度搜索、回溯。

2.定义变量

  • 定义变量:n表示迷宫的大小;二维数组mg[30][30]存储迷宫信息,其中0代表可通行,1代表障碍;二维数组bj[1000][1000]用于记录路径上的坐标。
int n,mg[30][30],bj[1000][1000]; 

3.输入数据

//三、数据输入
	cin>>n; 
	for(int i=1;i<=n;i++){
		string s;
		cin>>s;
		for(int j=1;j<=n;j++){
			mg[i][j]=s[j-1]-'0';
		}
	}

4.数据计算

  • 调用dfs(1,1,1)开始从左上角(1,1)搜索到右下角。
//四、数据计算 
	dfs(1,1,1);
  • 定义一个深度优先搜索(DFS)函数,用于递归探索迷宫路径。
int  dfs(int x,int y,int k){
	if(x<1||x>n||y<1||y>n||mg[x][y]!=0){
		return k;
	}
	
	bj[k][1]=x;
	bj[k][2]=y;
	mg[x][y]=1;
	
	if(x==n&&y==n){
		//五、输出结果 
		for(int i=1;i<=k;i++){
			cout<<"("<<bj[i][1]<<","<<bj[i][2]<<")";
			if(i!=k){
				cout<<"->";
			}
		}
	}
	//左 
	dfs(x,y-1,k+1); 
	//上
	dfs(x-1,y,k+1);
	//右
	dfs(x,y+1,k+1);
	//下 
	dfs(x+1,y,k+1);
}

完整代码如下:

#include<bits/stdc++.h> // 包含C++常用库函数
using namespace std; // 使用std命名空间以简化代码

int n, // 迷宫的尺寸
    mg[30][30], // 用于存储迷宫地图,0表示可通过,1表示障碍
    bj[1000][1000]; // 记录搜索过程中的路径坐标

// 深度优先搜索函数
// 参数: x, y 当前坐标;k 走过的步数(也作为bj数组的索引)
int dfs(int x, int y, int k){
    // 判断当前位置是否合法或已被访问
    if(x < 1 || x > n || y < 1 || y > n || mg[x][y] != 0){
        return k; // 不合法或已访问过,返回当前步数
    }
    
    // 记录路径
    bj[k][1] = x;
    bj[k][2] = y;
    mg[x][y] = 1; // 标记当前格子已访问
    
    // 如果到达右下角,输出路径并结束
    if(x == n && y == n){
        for(int i = 1; i <= k; i++){
            cout << "(" << bj[i][1] << "," << bj[i][2] << ")";
            if(i != k){ // 非最后一项添加箭头
                cout << "->";
            }
        }
    }
    
    // 递归搜索四个方向
    dfs(x, y-1, k+1); // 左
    dfs(x-1, y, k+1); // 上
    dfs(x, y+1, k+1); // 右
    dfs(x+1, y, k+1); // 下
    
    // 注意:此函数设计上没有直接利用返回值,实际搜索中无需返回具体值
}

int main(){
    // 输入迷宫尺寸
    cin >> n; 
    
    // 输入并构建迷宫地图
    for(int i = 1; i <= n; i++){
        string s;
        cin >> s;
        for(int j = 1; j <= n; j++){
            mg[i][j] = s[j-1] - '0'; // 字符转数字,'0' ASCII值为48,因此减去'0'得到数字
        }
    }
    
    // 开始搜索
    dfs(1, 1, 1); // 从(1,1)开始搜索,初始步数为1
    
    return 0; // 程序正常结束
}

三、感谢

如若本文对您的学习或工作有所启发和帮助,恳请您给予宝贵的支持——轻轻一点,为文章点赞;若觉得内容值得分享给更多朋友,欢迎转发扩散;若认为此篇内容具有长期参考价值,敬请收藏以便随时查阅。

每一次您的点赞、分享与收藏,都是对我持续创作和分享的热情鼓励,也是推动我不断提供更多高质量内容的动力源泉。期待我们在下一篇文章中再次相遇,共同攀登知识的高峰!

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

路由框架 ARouter 原理及源码解析

文章目录 前言一、ARouter 简介二、ARouter 使用1.添加依赖和配置2.添加注解3.初始化SDK4.发起路由操作 三、ARouter 成员1. PostCard 明信片2. Interceptor 拦截器3. Warehouse 路由仓库4. ARouter 注解处理 四、ARouter 原理五、ARouter 源码分析1. ARouter 初始化1.1 ARoute…

类的继承性(Java)

本篇学习面向对象语言的第二特性——继承性。 1 .为什么需要继承 我们来举个例子&#xff1a;我们知道动物有很多种&#xff0c;是一个比较大的概念。在动物的种类中&#xff0c;我们熟悉的有猫(Cat)、狗(Dog)等动物&#xff0c;它们都有动物的一般特征&#xff08;比如能够吃…

leetcode498 对角线遍历

题目 给你一个大小为 m x n 的矩阵 mat &#xff0c;请以对角线遍历的顺序&#xff0c;用一个数组返回这个矩阵中的所有元素。 示例 输入&#xff1a;mat [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,4,7,5,3,6,8,9] 解析 本题目主要考察的就是模拟法&#xff0c;首…

【动态规划】斐波那契数列模型 {动态规划的解题思路;动态规划的优化方案;动态规划的基础题型}

一、经验总结 动态规划题型的解题思路&#xff1a; 状态表示&#xff1a;dp[i]的含义是什么。通过解题经验和题目要求得到&#xff0c;一般有以下两个方向&#xff1a; 以i位置为起点以i位置为终点 状态转移方程&#xff1a;dp[i]怎么求。根据距离i位置最近的一步划分问题&am…

公司面试题总结(六)

31.说一说 webpack 的构建流程是什么&#xff1f; ⚫ 初始化流程&#xff1a; ◼ 从配置文件和 Shell 语句中读取与合并参数 ◼ 初始化需要使用的插件和配置插件等执行环境所需要的参数 ⚫ 编译构建流程&#xff1a; ◼ 从 Entry 发出&#xff0c;针对每个 Module 串行…

【 ClickHouse】 ClickHouse数据类型(整型、浮点型、布尔型、Decimal型、字符串、数组、时间类型)(二)

ClickHouse数据类型 整型 固定长度的整型&#xff0c;包括有符号整型或无符号整型。 1)整型范围&#xff1a; Int8 - [-128 : 127] Int16 - [-32768 : 32767] Int32 - [-2147483648 : 2147483647] Int64 - [-9223372036854775808 : 9223372036854775807]2)无符号整型范围&…

【linux】内核从tcp层调用IP层摸索中

合入代码&#xff1a; 登录 - Gitee.com 这是运行日志&#xff1a; https://gitee.com/r77683962/linux-6.9.0/raw/master/test_log/kern_tcp_ip.log 日志截取部分&#xff08;也不知道对不对&#xff0c;凭感觉走。。。。&#xff09;

关机充电动画:流程与定制

关机充电动画&#xff1a;流程与定制 基于MTK平台Android 11分析 生成logo.bin 关机充电动画是由一系列的bmp图片组成的&#xff0c;这些图片资源存在于vendor/mediatek/proprietary/bootable/bootloader/lk/dev/logo目录下&#xff08;当然不仅保护关机充电动画&#xff0c…

自动驾驶仿真:Carsim转向传动比设置

文章目录 一、转向传动比概念二、设置转向传动比1、C factor概念2、Steer Kinematics概念3、传动比计算公式 三、转向传动比验证 一、转向传动比概念 转向传动比&#xff08;Steering Ratio&#xff09;表示方向盘转动角度与车轮转动角度之间的关系。公式如下&#xff1a; 转向…

乘法与位运算

目录 描述 输入描述&#xff1a; 输出描述&#xff1a; 参考代码 描述 题目描述&#xff1a; 进行一个运算单元的电路设计&#xff0c;A[7:0]*11111011&#xff0c;尽量用最少的资源实现&#xff0c;写出对应的 RTL 代码。 信号示意&#xff1a; A信号输入 B 信号…

[自动驾驶 SoC]-4 特斯拉FSD

FSD, 参考资料来源FSD Chip - Tesla - WikiChip 另外可参考笔者之前分享文章&#xff1a;[自动驾驶技术]-6 Tesla自动驾驶方案之硬件&#xff08;AI Day 2021&#xff09;&#xff0c;​​​​​​​[自动驾驶技术]-8 Tesla自动驾驶方案之硬件&#xff08;AI Day 2022&#xf…

DGit的使用

将Remix连接到远程Git仓库 1.指定克隆的分支和深度 2.清理&#xff0c;如果您不在工作区上工作&#xff0c;请将其删除或推送至 GitHub 或 IPFS 以确保安全。 为了进行推送和拉取&#xff0c;你需要一个 PAT — 个人访问令牌 当使用 dGIT 插件在 GitHub 上推送、拉取、访问私…

Studying-代码随想录训练营day13| 二叉树理论基础、二叉树递归遍历、二叉树迭代遍历、二叉树层序遍历

第十三天&#xff0c;&#x1f4aa;(ง •_•)ง&#x1f4aa;&#xff0c;编程语言&#xff1a;C 目录 二叉树理论基础 二叉树的种类&#xff1a; 二叉树的存储方式 二叉树的遍历方式 二叉树的定义&#xff1a; 二叉树递归遍历 二叉树的迭代遍历 二叉树的层次遍历 …

数据库新技术【分布式数据库】

文章目录 第一章 概述1.1 基本概念1.1.1 分布式数据库1.1.2 数据管理的透明性1.1.3 可靠性1.1.4 分布式数据库与集中式数据库的区别 1.2 体系结构1.3 全局目录1.4 关系代数1.4.1 基操1.4.2 关系表达式1.4.3 查询树 第二章 分布式数据库的设计2.1 设计策略2.2 分布设计的目标2.3…

深度学习入门5——为什么神经网络可以学习?

在理解神经网络的可学习性之前&#xff0c;需要先从数学中的导数、数值微分、偏导数、梯度等概念入手&#xff0c;从而理解为什么神经网络具备学习能力。 1.数值微分的定义 先从导数出发理解什么是梯度。某一点的导数直观理解就是在该点的切线的斜率。在数学中导数表示某个瞬…

Spring的事务步骤

一、事务处理方案&#xff1a; Spring框架中提供的事务处理方案&#xff1a;一共有两种&#xff1a; 1.适合中小项目使用的&#xff0c; 注解方案&#xff1a; 注解的方式做事务用起来简单&#xff0c;灵活&#xff0c;方便&#xff0c;中小型项目中用它比较方便&#xff0c…

白酒:酒文化的教育价值与实践

酒文化作为中国传统文化的重要组成部分&#xff0c;具有丰富的教育价值。云仓酒庄的豪迈白酒作为酒文化的品牌之一&#xff0c;在传承与发展中不断挖掘和发挥酒文化的教育价值。 首先&#xff0c;豪迈白酒有责任传承丰富的历史文化知识。从酒的起源、酿造技艺、酒器文化到酒礼酒…

Github上传大于100M的文件(ubuntu教程)

安装Git-lfs Git Large File Storage (LFS) 使用 Git 内部的文本指针替换音频样本、视频、数据集和图形等大文件&#xff0c;同时将文件内容存储在 GitHub.com 或 GitHub Enterprise 等远程服务器上。官网下载&#xff1a;https://git-lfs.github.com/ ./install.sh上传 比如…

教你如何安装 IntelliJ IDEA

安装 IntelliJ IDEA 的步骤通常如下&#xff0c;这里提供的是基于 Windows 系统的安装指南。 下载 IntelliJ IDEA 1. 访问 JetBrains 官方网站&#xff1a;[https://www.jetbrains.com/idea/download/](Download IntelliJ IDEA – The Leading Java and Kotlin IDE) 2. 选择适…

一文带你入门【论文排版】利器·LaTeX |Macos

小罗碎碎念 我在刚开始写公众号的时候&#xff0c;写过一期推文&#xff0c;详细的讲解过如何使用LaTeX快速的进行论文排版。不过当时用的是windows的系统&#xff0c;这一次把Mac端的教程补上。 windows系统教程 https://zhuanlan.zhihu.com/p/677481269 LaTeX是一种流行的排…