蓝桥杯-穿越雷区

news2024/12/24 0:19:58

题目要求

需求:从一个方格中A点,按要求移动到B点。
要求:每次只能走上下左右,每次只能走一次,每次是轮换穿越’+‘,’-'两个,否则就会能量失衡,发生爆炸。

使用的算法:这题典型的就是使用BFS算法,DFS也是可以的,不过BFS明显最为简单。

bfs算法,优先广度搜索

int bfs(std::pair<int,int>s,std::pair<int,int>t)
{
	std::map<  std::pair<int,int>, std::pair<int,int>>processor;//记录前驱与后继节点进行回溯的 
	int  visted[5][5];
	memset(visted,0,sizeof(visted));
	int orient[4][2]={{-1,0},{1,0},{0,-1},{0,1}};//定义上下左右移动的方向
	std::queue<std::pair<int,int>> que; //定义一个队列
	que.push(s);
	visted[s.first][s.second]=1; 
	while(!que.empty()) 
	{
		//取出第一个元素
		auto temp=que.front();
		que.pop();//弹出队列第一个位置元素 
		if( temp.first == t.first && temp.second == t.second )
			break ;
		for(int i=0;i<4;i++)
		{  
		
			std::pair<int,int> next =std::make_pair(temp.first+orient[i][0],temp.second+orient[i][1]);
			if(next.first >=0 && next.first <=4 && 
			next.second >=0 && next.second <=4 && 
			visted[ next.first][next.second] !=1 &&
			map_info[temp.first][temp.second] != map_info[next.first][next.second] )
			{
				visted[next.first][next.second] =1;//表示已经走过了 
				que.push(next);
				processor[next]=temp;
				
				cout<<temp.first<<"  "<<temp.second<<"       "<<next.first << "  "<<next.second<<endl;
			}
		}
		cout<<"--------------------------"<<endl;
	}
	
	
//反向回溯路径	
	std::vector<std::pair<int,int>> ops;
	for(std::pair<int,int> at =t;at!=s;at=processor[at])
		{
			if(processor.find(at) ==processor.end())
				return -1;
			ops.push_back(at);
		}
		
		
//只是为了显示结果,打印出来	
	for(auto it=processor.begin();it!=processor.end();++it)
	{
		std::cout << "Key: (" << it->first.first << ", " << it->first.second << "), Value: (" 
                  << it->second.first << ", " << it->second.second << ")" << std::endl;

	}
	return ops.size();
	
}

全部代码如下

#include<bits/stdc++.h>
using namespace std;

char map_info[5][5]={
{'A','+','-','+','-'},
{'-','+','-','-','+'},
{'-','+','+','+','-'},
{'+','-','+','-','+'},
{'B','+','-','+','-'}
};

int bfs(std::pair<int,int>s,std::pair<int,int>t)
{
	std::map<  std::pair<int,int>, std::pair<int,int>>processor;//记录前驱与后继节点进行回溯的 
	int  visted[5][5];
	memset(visted,0,sizeof(visted));
	int orient[4][2]={{-1,0},{1,0},{0,-1},{0,1}};//定义上下左右移动的方向
	std::queue<std::pair<int,int>> que; //定义一个队列
	que.push(s);
	visted[s.first][s.second]=1; 
	while(!que.empty()) 
	{
		//取出第一个元素
		auto temp=que.front();
		que.pop();//弹出队列第一个位置元素 
		if( temp.first == t.first && temp.second == t.second )
			break ;
		for(int i=0;i<4;i++)
		{  
		
			std::pair<int,int> next =std::make_pair(temp.first+orient[i][0],temp.second+orient[i][1]);
			if(next.first >=0 && next.first <=4 && 
			next.second >=0 && next.second <=4 && 
			visted[ next.first][next.second] !=1 &&
			map_info[temp.first][temp.second] != map_info[next.first][next.second] )
			{
				visted[next.first][next.second] =1;//表示已经走过了 
				que.push(next);
				processor[next]=temp;
				
				cout<<temp.first<<"  "<<temp.second<<"       "<<next.first << "  "<<next.second<<endl;
			}
		}
		cout<<"--------------------------"<<endl;
	}
	
	
	
	std::vector<std::pair<int,int>> ops;
	for(std::pair<int,int> at =t;at!=s;at=processor[at])
		{
			if(processor.find(at) ==processor.end())
				return -1;
			ops.push_back(at);
		}
		
		
	
	for(auto it=processor.begin();it!=processor.end();++it)
	{
		std::cout << "Key: (" << it->first.first << ", " << it->first.second << "), Value: (" 
                  << it->second.first << ", " << it->second.second << ")" << std::endl;

	}
	return ops.size();
	
}



signed main()
{
	
	
	std::pair<int,int> s0=std::make_pair(0,0);
	std::pair<int,int> s1=std::make_pair(4,0);
	
cout<<	bfs(s0,s1);

	return 0;
}   

输出结果

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

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

相关文章

6款Mac垃圾清理软件横评 Mac电脑清理软件哪个好 cleanmymac评测

鉴于苹果笔记本昂贵的硬盘价格&#xff0c;导致我们不得不定期清理自己的硬盘空间&#xff0c;释放给真正有用的各种程序等。 即便我们把程序安装到外置硬盘&#xff0c;但是程序运行时的缓存&#xff0c;仍然是在内置的硬盘中。 今天就让我们对比看看&#xff0c;目前市面上…

Linux如何连接github仓库

一.创建一个github账号 如何创建一个github账号 二.在github上创建一个仓库 登录上github后出现这个界面 然后点击左上角头像&#xff0c;在按照图片位置点击&#xff1a; 继续按照图片上的位置进行点击&#xff1a; 创建成功&#xff1a; 三.云主机连接Github仓库 1.在linux中…

openstack云计算(二)——使用Packstack安装器安装一体化OpenStack云平台

初步掌握OpenStack快捷安装的方法。掌握OpenStack图形界面的基本操作。 一【准备阶段】 &#xff08;1&#xff09;准备一台能够安装OpenStack的实验用计算机&#xff0c;建议使用VMware虚拟机。 &#xff08;2&#xff09;该计算机应安装CentOS 7&#xff0c;建议采用CentO…

探究云手机的海外原生IP优势

随着全球数字化进程的加速&#xff0c;企业越来越依赖于网络来扩展其业务。在这个数字时代&#xff0c;云手机作为一种创新的通信技术&#xff0c;已经成为了企业网络优化的重要组成部分。云手机支持海外原生IP的特性&#xff0c;为企业在国际市场上的拓展提供了全新的可能性。…

基础布局之LinearLayout线性布局

目录 一、基础属性二、重点属性2.1 weight(权重)属性&#xff1a;2.2 gravity 一、基础属性 LinearLayout默认方向是水平排放 属性作用android:id控件的ID&#xff0c;可以通过这个ID号来找到对应的控件android:layout_width控件的宽度android:layout_height控件的高度androi…

解析Apache Kafka:在大数据体系中的基本概念和核心组件

关联阅读博客文章&#xff1a;探讨在大数据体系中API的通信机制与工作原理 关联阅读博客文章&#xff1a;深入解析大数据体系中的ETL工作原理及常见组件 关联阅读博客文章&#xff1a;深度剖析&#xff1a;计算机集群在大数据体系中的关键角色和技术要点 关联阅读博客文章&a…

大数据系列 | Kafka架构分析及应用

大数据系列 | Kafka架构分析及应用 1. Kafka原理分析2. Kafka架构分析3. Kafka的应用3.1. 安装Zookeeper集群3.2. 安装Kafka集群3.3. 生产者和消费者使用3.3.1. 生产者使用3.3.1. 消费者使用 4. Kafka Controller控制器 1. Kafka原理分析 Kafka是一个高吞吐量、 持久性的分布式…

vue项目打包优化之-productionSourceMap设置

productionSourceMap 是一个用于配置生产环境下是否生成 source map 文件的选项。在 webpack 中&#xff0c;source map 文件是一种映射关系文件&#xff0c;可以将编译后的代码映射回原始源代码&#xff0c;方便开发者在调试时定位问题。 在生产环境中&#xff0c;通常不建议暴…

海康摄像头插件嵌入iframe时视频播放插件位置问题

参考&#xff1a;https://juejin.cn/post/6857670423971758094 原因&#xff1a;没有按照iframe相对位置计算视频插件位置。 解决&#xff1a; $(window).on(resize, resize);function resize(){// 解决iframe中嵌入海康插件初始化问题:// 1. 获取iframe相比于窗口的偏移量;c…

单V及多V感知在自动驾驶在恶劣环境条件下的感知提升方案

单V及多V感知在自动驾驶在恶劣环境条件下的感知提升方案 附赠自动驾驶学习资料和量产经验&#xff1a;链接 自动驾驶中的视觉感知是车辆在不同交通条件下安全、可持续地行驶的关键部分。然而&#xff0c;在大雨和雾霾等恶劣天气下&#xff0c;视觉感知性能受到多种降级效应的极…

2021-08-06

yarn的简介&#xff1a; Yarn是facebook发布的一款取代npm的包管理工具。 yarn的特点&#xff1a; 速度超快。 Yarn 缓存了每个下载过的包&#xff0c;所以再次使用时无需重复下载。 同时利用并行下载以最大化资源利用率&#xff0c;因此安装速度更快。超级安全。 在执行代码…

适用于智能断路器、新能源汽车充电枪锁、电动玩具、电磁门锁等的直流电机驱动芯片D6289ADA介绍

应用领域 适用于智能断路器&#xff08;家用或工业智能空开&#xff09;、新能源汽车充电枪锁、电动玩具、电磁门锁、自动阀门等的直流电机驱动。 功能介绍 D6289ADA是一款直流马达驱动芯片&#xff0c;它有两个逻辑输入端子用来控制电机前进、后退及制动。该电路具有良好的抗干…

Qt 实现简易的视频播放器,功能选择视频,播放,暂停,前进,后退,进度条拖拉,视频时长显示

1.效果图 2.代码实现 2.1 .pro文件 QT core gui multimedia multimediawidgets 2.2 .h文件 #ifndef VIDEOPLAYING_H #define VIDEOPLAYING_H#include <QWidget> #include<QFileDialog>#include<QMediaPlayer> #include<QMediaRecorder> #in…

数据分析之Tebleau可视化:折线图、饼图、环形图

1.折线图的绘制 方法一&#xff1a; 拖入订单日期和销售金额&#xff0c;自动生成一个折线图 方法二&#xff1a; 选中订单日期和销售金额&#xff08;摁住ctrl可以选择多个纬度&#xff09; 点击右边的智能推荐&#xff0c;选择折线图 2.双线图的绘制、双轴的设置 方法一&…

手机一键换ip地址,解锁网络自由

在数字化时代&#xff0c;手机已经成为我们生活中不可或缺的一部分。随着移动互联网的快速发展&#xff0c;手机用户对于网络安全和隐私保护的需求也日益增强。其中&#xff0c;IP地址作为手机在网络中的标识&#xff0c;扮演着重要的角色。有时&#xff0c;出于隐私保护或网络…

HTTPS 如何优化?(计算机网络)

硬件优化 因为 HTTPS 是属于计算密集型&#xff0c;应该选择计算力更强的 CPU&#xff0c;而且最好选择支持 AES-NI 特性的 CPU&#xff0c;这个特性可以在硬件级别优化 AES 对称加密算法&#xff0c;加快应用数据的加解密。 软件优化 如果可以&#xff0c;把软件升级成较新的版…

Scala第十五章节(递归的相关概述、Scala阶乘案例、Scala斐波那契数列案例、Scala打印目录文件案例)

章节目标 了解递归的相关概述掌握阶乘案例掌握斐波那契数列案例掌握打印目录文件案例 1. 递归 递归指的就是 方法自己调用自己的情况 . 在涉及到复杂操作时, 我们会经常用到它. 在使用递归时, 要注意以下三点: 递归必须有出口, 否则容易造成 死递归 .递归必须要有规律.构造…

网址打包微信小程序源码 wap转微信小程序 网站转小程序源码 网址转小程序开发

内容目录 一、详细介绍二、效果展示2.效果图展示 三、学习资料下载 一、详细介绍 我们都知道微信小程序是无法直接打开网址的。 这个小程序源码提供了一种将网址直接打包成微信小程序的方法&#xff0c; 使得用户可以在微信小程序中直接访问这些网址内容。 这个源码没有进行加…

如何评估基于指令微调的视觉语言模型的各项能力-MMBench论文解读

1. 传统基准的固有局限 VQAv2:视觉问题回答数据集,主要用于评估视觉理解与推理能力。COCO Caption:图像描述生成数据集,用于评估模型对图像内容的理解与描述能力。GQA:结合常识的视觉问题回答数据集。OK-VQA:需要外部知识的视觉问题回答数据集。TextVQA:图像中包含文本的…

RAG论文 Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks

RAG&#xff08;Retrieval-Augmented Generation&#xff0c;检索增强生成&#xff09;由Facebook在2020年发表的论文 Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks 语言模型存在幻觉 由于知识缺乏&#xff0c;没有实时增量信息没有具体领域的拓展信息…