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

news2024/11/18 18:23:09

文章目录

  • 一、前言
  • 二、问题
    • 问题: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; // 程序正常结束
}

三、感谢

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

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

在这里插入图片描述

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

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

相关文章

网卡故障但bond0不切换原因及处理、脚本监控bond0网卡状态并做相应操作

文章目录 故障说明监控脚本脚本编写脚本测试正常场景异常场景1异常场景2脚本准备和修改网卡名脚本拷贝到所有需要监控主机修改网卡名批量执行脚本故障说明 在一次交换机升级的割接中,主备交换机重启的时候,我们发现了一个问题,有几台宿主机会中断【ping不通】,交换机重启完…

类的继承性(Java)

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

web安全渗透测试十大常规项(一):web渗透测试之XML和XXE外部实体注入

#详细点: XML被设计为传输和存储数据,XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具。等同于JSON传输。XXE漏洞XML External Entity Injection,即xml外部实体注入漏洞,XXE漏洞发…

Prometheus告警Alertmanager部署

Prometheus告警Alertmanager部署 资源监控一般离不开预警&#xff0c;因为我们不可能每时每刻都盯着某个资源监控看&#xff0c;而且在实际的工作中当中我们搭建的解决方案涉及到的服务器是多台甚至数十台&#xff0c;所以更加不现实&#xff0c;因此资源告警是一个必不可少的…

男士内裤品牌哪个好?2024公认好穿的五款男士内裤分享

男士内裤作为大家每天都要长时间穿着的贴身衣物&#xff0c;它的重要性不言而喻。为了确保健康与卫生&#xff0c;专家和医生建议您每三个月更换一次内裤&#xff0c;避免细菌滋生&#xff0c;让身体更加清爽自在。而一款优质的内裤&#xff0c;不仅要有舒适的弹性&#xff0c;…

学生课程信息管理系统

摘 要 目前&#xff0c;随着科学经济的不断发展&#xff0c;高校规模不断扩大&#xff0c;所招收的学生人数越来越 多&#xff1b;所开设的课程也越来越多。随之而来的是高校需要管理更多的事务。对于日益增 长的学生相关专业的课程也在不断增多&#xff0c;高校对其管理具有一…

《无与伦比》Centos7 扩容到已有逻辑卷

命令可以查找硬盘和分区情况 fdisk -l lsblk

【会议征稿,CPS出版】第三届先进机械电子与电气工程国际学术会议(ICAMEE 2024,7月19-21)

第三届先进机械电子与电气工程国际学术会议&#xff08;ICAMEE 2024&#xff09;将于2024年7月19-21日在桂林隆重举行。会议主要围绕“机械电子”、“电气工程” 等研究领域展开讨论&#xff0c; 旨在为机械电子、电气工程等领域的专家学者、工程技术人员、技术研发人员提供一个…

项目文章 | ATAC-seq联合转录组探究牦牛肌肉的调控机制

还在苦恼没有研究方向&#xff1f;还在找寻开启调控表观调控大门的钥匙&#xff1f;拿到材料不知如何下手&#xff1f;两篇ATAC联合转录组的牦牛调控机制分析或许能给你一点方向。 为了研究不同牦牛品种之间以及牦牛在成熟过程中&#xff0c;骨骼肌的调控如何影响肉类品质&…

OpenStack快速入门

任务一 熟悉OpenStack图形界面操作 1.1 Horizon项目 •各OpenStack服务的图形界面都是由Horizon提供的。 •Horizon提供基于Web的模块化用户界面。 •Horizon为云管理员提供一个整体的视图。 •Horizon为终端用户提供一个自主服务的门户。 •Horizon由云管理员进行管理…

Datacom HCIE实验考试通过率90%!深圳智汇云校传来5月捷报!

坚持不懈地努力&#xff0c;才能取得成功的果实 这是不变的真理 深圳云校传来5月捷报 在Datacom HCIE实验考试中 共有10名学员应战 其中9名学员凭借出色的表现 一次性通过了考试 展现出了扎实的技术能力 通过率高达90% &#xff08;华为历年考试平均通过率约60%&#…

【Hudi】基础概念-数据写

目录 数据写写操作写流程(UPSERT)写流程(Insert)写流程(Insert Overwrite)Key生成策略删除策略 数据写 写操作 UPSERT&#xff1a;默认行为&#xff0c;数据先通过index打标&#xff0c;有一些启发式算法决定消息的组织以及优化文件的大小>CDC导入INSERT:跳过index,写入效…

Java历史

Java程序设计语言史 Java是一种面向对象的编程语言&#xff0c;由Sun Microsystems于1990年初由开发人员James Gosling、Mike Sheridan和Patrick Naughton开发。1991年&#xff0c;詹姆斯戈斯林和他的朋友们组成了一个名为“绿色团队”的团队&#xff0c;进一步致力于这个项…

如何使用nginx 将新老网站域名重定向?(亲测收藏版)

目录 1. 安装Nginx 2. 配置Nginx 3. 启用新配置 结论 最近公司需要推行海外的业务&#xff0c;原来公司的名字麦聪软件的官网maicongs.com暂时用不上了&#xff0c;想启用sqlynx.com&#xff0c;但因为历史流量的原因&#xff0c;有很多的业务是指向的maicongs.com&#xf…

小程序分页新写法

// pages/query/query.js import {request } from ../../utils/request; Page({/*** 页面的初始数据*/data: {tabClickIndex: ,page: 1,limit: 10,listData: []},/*** 生命周期函数--监听页面加载*/onLoad(options) {this.getList()},/*** 生命周期函数--监听页面初次渲染完成*…

Sylar C++高性能服务器学习记录23 【Http模块-知识储备篇】

早在19年5月就在某站上看到sylar的视频了&#xff0c;一直认为这是一个非常不错的视频。 由于本人一直是自学编程&#xff0c;基础不扎实&#xff0c;也没有任何人的督促&#xff0c;没能坚持下去。 每每想起倍感惋惜&#xff0c;遂提笔再续前缘。 为了能更好的看懂sylar&…

Python10 python多线程

1.什么是python多线程 Python的多线程指的是在一个Python程序中同时运行多个线程&#xff0c;以达到并发执行多个任务的目的。线程是操作系统能够进行运算调度的最小单位&#xff0c;它被包含在进程之中&#xff0c;是进程中的实际运作单位。 在Python中&#xff0c;多线程的…

C# OCCT Winform 选中模型改变状态

选中状态设置 _context new AIS_InteractiveContext(_viewer);var selectionDrawer new Prs3d_Drawer();selectionDrawer.SetColor(Colors.Selection);selectionDrawer.SetDisplayMode(1);selectionDrawer.SetTransparency(0.1f);_context.SetSelectionStyle(selectionDrawe…

【机器学习】机器学习重要方法——无监督学习:理论、算法与实践

文章目录 引言第一章 无监督学习的基本概念1.1 什么是无监督学习1.2 无监督学习的主要任务 第二章 无监督学习的核心算法2.1 聚类算法2.1.1 K均值聚类2.1.2 层次聚类2.1.3 DBSCAN聚类 2.2 降维算法2.2.1 主成分分析&#xff08;PCA&#xff09;2.2.2 t-SNE 2.3 异常检测算法2.3…

【Gradio】Chatbot | 如何使用 Gradio Blocks 创建自定义聊天机器人

简介 重要提示&#xff1a;如果您刚开始接触&#xff0c;我们建议使用 gr.ChatInterface 来创建聊天机器人——它是一个高级抽象&#xff0c;使得可以快速创建漂亮的聊天机器人应用程序&#xff0c;往往只需一行代码。在这里了解更多信息。 本教程将展示如何使用 Gradio 的低级…