P1825 [USACO11OPEN] Corn Maze S 广度优先搜索

文章目录

  • 题目链接
  • 题目描述
  • 解题思路
  • 代码实现
  • 总结


题目链接

链接: P1825 [USACO11OPEN] Corn Maze S

题目描述

在这里插入图片描述

解题思路

这道题目是一个典型的迷宫问题,我们需要找出从起点到终点的最短路径。解决这类问题的常用方法是使用广度优先搜索(BFS)算法。

首先,我们需要读取迷宫的输入,并确定起点的位置。然后,我们可以使用一个队列来存储每一步的状态,其中每个状态记录了当前位置的坐标和到达该位置的步数。我们还需要一个布尔数组来标记已经访问过的位置,以避免重复访问。

在搜索过程中,我们从起点出发,将起点的状态加入队列,并标记起点为已访问。然后,我们不断从队列中取出状态,并根据当前位置的上下左右四个方向进行扩展。如果扩展得到的位置是墙壁或已经访问过的位置,则跳过该位置。如果扩展得到的位置是传送门,则查找相应传送门的另一端位置,并将另一端位置的状态加入队列,步数加1。如果扩展得到的位置是空地,则将该位置的状态加入队列,步数加1,并标记该位置为已访问。

当遇到传送门时,我们需要查找相应传送门的另一端位置,并将另一端位置的状态加入队列,步数加1。

具体而言,我们可以在搜索过程中,判断当前位置是否为传送门(即位置上的字符为大写字母)。如果是传送门,我们可以调用一个函数 cs(char c, int x, int y) 来查找传送门 c 的另一端位置。该函数会遍历迷宫中的其他位置,找到与给定传送门对应的传送门位置。

在函数 cs 中,我们可以使用两层循环遍历迷宫的每个位置:

对于每个位置 (i, j),如果它不是当前位置 (x, y),并且字符为传送门 c,则返回位置 (i, j)。
如果 cs 函数找到了与传送门 c 对应的位置 (i, j),我们可以将该位置的状态 (i, j, t.step + 1) 加入队列,步数加1。其中 t.step + 1 表示到达 (i, j) 位置需要的步数。

需要注意的是,如果 cs 函数没有找到与传送门 c 对应的位置,我们应该返回一个特殊的标记,例如 {-1, -1},表示未找到对应的传送门。

通过在搜索过程中处理传送门,我们可以在搜索最短路径时,考虑迷宫中的传送功能,从而得到正确的结果。

我们在搜索过程中不断扩展状态,直到队列为空或者找到等号位置。如果最终找到等号位置,则输出到达该位置的步数;否则,输出-1表示无解。

代码实现

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
const int N=310;
char a[N][N];
bool st[N][N];
struct node{
	int x;
	int y;
	int step;
}q[N*N];
int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
int n,m,ans;
PII cs(char c,int x,int y)
{
	for(int i=1;i<n-2;i++)
	 for(int j=1;j<m-2;j++)
	  if(i!=x&&a[i][j]==c) 
	   return {i,j};
}
void bfs(int x,int y)
{
	int hh=0,tt=0;
	q[0]={x,y,0}; 
	st[x][y]=true;
	while(hh<=tt)
	{
		node t=q[hh++];
		if(a[t.x][t.y]=='='){
			cout<<t.step<<endl;
			return;
		} 
		for(int i=0;i<4;i++)
		{
			int nx=t.x+dx[i];
			int ny=t.y+dy[i];
			if(a[nx][ny]=='#'||st[nx][ny]) continue;
			 if ( ny < m && a[nx][ny] != '#' && !st[nx][ny]) {
                st[nx][ny] = true;
                if (a[nx][ny] >= 'A' && a[nx][ny] <= 'Z') {
                    // 寻找对应传送门的位置
                    for (int j = 1; j < n-1; j++) {
                        for (int k = 1; k < m-1; k++) {
                            if (a[j][k] == a[nx][ny] && (j != nx || k != ny)) {
                                q[++tt]={j,k,t.step+1};
                                break;
                            }
                        }
                    }
                } else {
                    q[++tt]={nx, ny, t.step + 1};
                }
            }
		}
	}
}
int main()
{
	int bx,by;//起始点 
	cin>>n>>m;
	
	for(int i=0;i<n;i++)
	 for(int j=0;j<m;j++)
	 {
	 	cin>>a[i][j];
        if(a[i][j]=='@') bx=i,by=j;
	 } 	
	 
	bfs(bx,by);
	
	return 0;
}

总结

总结起来,解决这道题目的关键思路是使用BFS算法进行图的遍历,通过不断扩展状态来搜索迷宫中的最短路径。通过使用队列和标记数组,我们可以确保每个位置只被访问一次,并且在找到目标位置时能够得到最短路径的步数。
通过解决这道题目,我们学到了以下几个关键点:

  1. 广度优先搜索(BFS)算法:这道题目的解题思路主要基于广度优先搜索算法。BFS是一种遍历图的算法,它从起点开始,逐层扩展搜索,直到找到目标位置。在解决迷宫问题中,BFS可以帮助我们找到最短路径。

  2. 处理传送门:题目要求我们要处理迷宫中的传送门。通过编写一个函数来查找传送门的另一端位置,我们可以在搜索过程中正确处理传送门带来的跳跃和路径缩短。

  3. 队列和标记数组的应用:使用队列和标记数组可以帮助我们进行状态扩展和避免重复访问。队列可以用来存储每一步的状态,并按照先进先出的顺序进行扩展,确保每个位置只被访问一次。标记数组用于标记已经访问过的位置,以避免重复访问。

在思考这道题目时,我们需要考虑以下几个方面:

  1. 思考问题的复杂度:对于某些复杂的问题,我们需要思考如何降低问题解决的复杂度。在这道题目中,我们使用了广度优先搜索算法,通过按层扩展的方式遍历迷宫,从而找到最短路径。这种方式能够确保我们找到的路径是最短的。

  2. 掌握基本的数据结构和算法:解决这道题目需要我们熟悉广度优先搜索算法以及队列和标记数组的应用。理解并灵活运用这些基本的数据结构和算法可以帮助我们解决更复杂的问题。

  3. 注重程序的可读性和可维护性:在解决问题的过程中,我们要注意编写具有良好可读性和可维护性的代码。合理的代码结构和注释可以使我们更好地理解和调试代码,并且在以后需要修改或扩展代码时能够更加容易。

总而言之,通过这道题目我们不仅学习了基本的算法思想和数据结构,还培养了解决问题的思维和优化思考的能力。同时,我们也明确了代码可读性和可维护性在开发过程中的重要性。

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

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

相关文章

Oracle 12.2 暴力处理sysaux空间占满问题

基本环境 数据库&#xff1a;oracle 12.2 RAC 操作系统&#xff1a;unix&solaris 11.3 报错现像 今天处理别的问题查看告警日志偶然发现大量的报错&#xff0c;无法扩展SYSAUX表空间 于是登录系统&#xff0c;查看系统表空间使用情况&#xff0c;发现SYSAUX表空间用满了 …

事件分发机制:demo复现子View的点击事件不起作用

demo使用的sdk是32 自定义一个MyLayout&#xff0c;继承自LinearLayout&#xff0c;重写onInterceptTouchEvent方法&#xff0c;返回true。如下&#xff1a; package com.exp.clickdemo;import android.content.Context; import android.util.AttributeSet; import android.vi…

GSM模块的使用及注意事项

1.如何使用&#xff1f; 最近&#xff0c;我准备使用GSM模块&#xff08;SIM900A&#xff09;发送英文短信到指定号码&#xff0c;翻阅资料如下&#xff1a; 可见&#xff0c;只要给该模块按照如下步骤发送指令&#xff1a; 就可以使得模块正常工作。&#xff08;SIM900A&#…

PHP漏洞查询

CVE - Search CVE List (mitre.org) 美国国家漏洞数据库&#xff08;需要梯子&#xff09; NATIONAL VULNERABILITY DATABASE NVD - Search and Statistics (nist.gov) 基本都能查询到&#xff0c;传结果详情页里面会有一些解决方案的连接 PHP的官方网站 PHP :: Bugs :: Se…

计算机设计大赛 深度学习 python opencv 火焰检测识别

文章目录 0 前言1 基于YOLO的火焰检测与识别2 课题背景3 卷积神经网络3.1 卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV54.1 网络架构图4.2 输入端4.3 基准网络4.4 Neck网络4.5 Head输出层 5 数据集准备5.1 数…

「C/C++」常见注释格式

✨博客主页何曾参静谧的博客📌文章专栏「C/C++」C/C++程序设计📚全部专栏「VS」Visual Studio「C/C++」C/C++程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasolid函数说明

办公软件巨头CCED、WPS面临新考验,新款办公软件异军突起

办公软件巨头CCED、WPS的成长经历 众所周知&#xff0c;CCED和WPS在中国办公软件领域树立了两大知名品牌的地位。然而&#xff0c;它们的成功并非一朝一夕的成就&#xff0c;而是历经了长时间的发展与积淀。 在上世纪80年代末至90年代初&#xff0c;CCED作为中国大陆早期的一款…

操作系统基础:内存管理概述【上】

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;OS从基础到进阶 &#x1f3d5;️1 内存管理基础概念&#x1f3e1;1.1 总览&#x1f3e1;1.2 内存管理应有的功能&#x1f3d6;️1.2.1 内存空间的分配和回收&#x1f3d6;️1.2.2 从逻辑上…

设计模式学习笔记04(小滴课堂)

1.创建基础类&#xff1a; 调用它进行类对象的复制&#xff1a; 但是如果属性都是基本数据类型确实像这样很简单&#xff0c;但是如果属性中也包含复杂的数据类型呢&#xff1f; 再去测试一下&#xff1a; 我们发现person1和person2的list属性值的内容是同步的&#xff0c;这显…

动态微信小程序码和开发者工具解析小程序码

一、动态生成微信小程序码 1、方式一 微信官方网站&#xff0c;对已发布的小程序&#xff0c;提供了一个快捷的入口&#xff0c;输入微信小程序的page页面即可。 page页面可以通过右侧开启入口获取 也可以通过开发者工具左下角的页面地址和参数地址那里获取到 二、生成的小…

王道考研复试机试学习

机试 绪论第一章枚举和模拟1.1枚举问题简介1.2 abc1.3代码调试 绪论 1.把讲解的都做会 2.不要贪多&#xff0c;要弄懂一类题目 3.要常回顾和总结 第一章枚举和模拟 1.1枚举问题简介 列出问题所有情况&#xff0c;一个一个去试。 1.2 abc 链接&#xff1a;abc问题 设a、b、…

大模型运行成本对比:GPT-3.5/4 vs. 开源托管

在过去的几个月里&#xff0c;生成式人工智能领域出现了许多令人兴奋的新进展。 ChatGPT 于 2022 年底发布&#xff0c;席卷了人工智能世界。 作为回应&#xff0c;各行业开始研究大型语言模型以及如何将其纳入其业务中。 然而&#xff0c;在医疗保健、金融和法律行业等敏感应用…

nosql数据库期末考试知识点总结

目录 1、什么是nosql数据库&#xff0c;它包括哪些 文档数据库 建数据 哪一种是最简单的 2、什么是文档数据库 3、创建mongodb时默认会建造三个数据库&#xff0c;是哪三个 4、mongodb支持的数据类型有哪些 5、它的常规语句有哪些 6、副本集和分片集有什么作用 复制 …

FPGA高端图像处理开发板:鲲叔1号,寄托了未来的一块开发板

前言 在CSDN写博客传播FPGA开发经验已经一年多了&#xff0c;帮助了不少人&#xff0c;也得罪了不少人&#xff0c;有的人用我的代码赢得了某些比赛、得到了心仪的offer&#xff0c;也有的人天天骂我&#xff0c;anyway&#xff0c;哪怕只要还能帮助一个即将毕业的学生找到工作…

深入了解键盘:分类、工作原理与操作指南

键盘 键盘是计算机使用的主要输入设备之一&#xff0c;键盘主要由创建字母、数字和符号并执行附加功能的按钮组成&#xff0c;通常用于向计算机或其他数字设备输入文本、命令和各种控制信号。 键盘是计算机中最重要的字符输入设备&#xff0c;其基本组成元件是按键开关&#…

Python算法题集_矩阵置零

Python算法题集_矩阵置零 题73&#xff1a;矩阵置零1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【三层循环】2) 改进版一【纵横计数器】3) 改进版二【原地算法】 4. 最优算法 本文为Python算法题集之一的代码示例 题73&#xff1a;矩阵置零…

JAVAEE初阶 网络编程(十)

http协议 一.HTTP协议简介二. HTTP捕获工具的使用三. 请求和响应包含的部分四. 认识URL 一.HTTP协议简介 HTTP协议最主要的应用场景就是网站&#xff0c;在浏览器和服务器之间&#xff0c;传输数据&#xff0c; 所谓网页&#xff0c;就是用超文本标记语言HTML和CSS&#xff0c;…

废品上门回收小程序搭建全过程

随着人们对环境保护意识的不断增强&#xff0c;废品回收成为了一项重要的社会活动。为了方便废品回收的顾客和回收者之间的联系&#xff0c;废品上门回收小程序成为了一种流行的解决方案。然而&#xff0c;如何选择一款合适的废品上门回收小程序搭建平台呢&#xff1f;下面将为…

如何衡量代码的复杂度

圈复杂度概要 最近的培训中了解到了一个概念&#xff0c;叫做圈复杂度。 圈复杂度&#xff08;Cyclomatic Complexity&#xff09;是一种衡量程序复杂度的度量方法。它由美国计算机科学家 Thomas J. McCabe 在 1976 年提出。圈复杂度通过统计程序的控制流图中的决策结构&…

Centos Cron设置定时任务

这本是很简单的问题&#xff0c;但是我服务器重装系统两次&#xff0c;遇到的问题都不一样&#xff0c;所以记录一下 1.首先要确保服务器上有 cron 服务 sudo systemctl status crond2.设置时区 sudo timedatectl set-timezone Asia/Shanghai3.重启crond 服务使crond服务的时…