蓝桥杯-穿越雷区

题目要求

需求:从一个方格中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;
}   

输出结果

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

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

相关文章

nginx的安装教程

文章目录 简介nginx安装windows下安装linux下安装 简介 nginx是一个开源的web服务器和反向代理服务器&#xff0c;可以用作负载均衡和HTTP缓存。它处理并发能力是十分强大的&#xff0c;能够经受高负载的考验。 正向代理 Nginx不仅可以做反向代理&#xff0c;实现负载均衡&am…

AI工作站设计方案:903-多路PCIe3.0的单CPU 学习型AI工作站

多路PCIe3.0的单CPU 学习型AI工作站 一、机箱功能和技术指标&#xff1a; 系统 系统型号 ORI-SR500 主板支持 EEB(12*13)/CEB(12*10.5)/ATX(12*9.6)/Mi cro ATX 前置硬盘 最大支持2个3.5寸1个2.5寸SATA 硬盘2个2.5寸SATA 硬盘 &#xff08;背部&#xff09; 电源类型 C…

【Django开发】前后端分离美多商城项目第4篇:用户部分,1. 判断用户名是否存在【附代码文档】

美多商城项目4.0文档完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;美多商城&#xff0c;项目准备1.B2B--企业对企业,2.C2C--个人对个人,3.B2C--企业对个人,4.C2B--个人对企业,5.O2O--线上到线下,6.F2C--工厂到个人。项目准备&#xff0c;配置1. 修改set…

阿里云服务器ECS经济型e实例怎么样?

阿里云服务器ECS经济型e系列是阿里云面向个人开发者、学生、小微企业&#xff0c;在中小型网站建设、开发测试、轻量级应用等场景推出的全新入门级云服务器&#xff0c;CPU处理器采用Intel Xeon Platinum架构处理器&#xff0c;支持1:1、1:2、1:4多种处理器内存配比&#xff0c…

vue3组合式函数

vue3的组合式函数的作用是封装和复用响应式状态的函数。只能在setup 标签的script标签汇总或者setup函数中使用。 普通的函数只能调用一次&#xff0c;但是组合式函数接受到响应式参数&#xff0c;当该值发生变化时&#xff0c;也会触发相关函数的重新加载。 如下 定义了一个…

算法(滑动窗口四)

1.串联所有单词的子串 给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。 s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。 例如&#xff0c;如果 words ["ab","cd","ef"]&#xff…

《QDebug 2024年3月》

一、Qt Widgets 问题交流 1. 二、Qt Quick 问题交流 1.Qt5 ApplicationWindow 不能使用父组件 Window 的 transientParent 属性 ApplicationWindow 使用 transientParent 报错&#xff1a; "ApplicationWindow.transientParent" is not available due to compone…

Android车载设备开发相关名词介绍

一、通讯相关 1、ECALL 如遭遇紧急情况&#xff0c;用户可按下该键以最高优先级接通呼叫中心&#xff0c;人工坐席将同时获取客户车辆的重要数据并协助驾驶员脱离危险。 实现原理 E-Call 的核心思想是利用车载卫星定位系统获取车辆的位置信息&#xff0c;在事故发生后&#x…

性能测试入门 —— 什么是性能测试PTS?

性能测试PTS&#xff08;Performance Testing Service&#xff09;是一款简单易用&#xff0c;具备强大的分布式压测能力的SaaS压测平台。 PTS可以模拟复杂的业务场景&#xff0c;并快速精准地调度不同规模的流量&#xff0c;同时提供压测过程中多维度的监控指标和日志记录。您…

输出100~200之间的素数(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>//实现素数判断函数&#xff1b; int Prime(int number) {//初始化变量值&#xff1b;int divided 2;int JudgementCondition 0;//循环判断素数&#xff1b;wh…

Git的使用【入门级】--下载github项目

1.下载Git Git for Windows Windows版本进入如上网址下载&#xff1a; 点击Download即可&#xff0c;建议下载到内存多的盘&#xff0c;我是下载到移动固态优盘中&#xff0c;以免C盘太挤。 验证Git是否安装成功&#xff1a; 双击git-bash.exe&#xff0c;命令行输入git versi…

【Django开发】0到1美多商城项目md教程第4篇:图形验证码,1. 图形验证码接口设计【附代码文档】

美多商城完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;欢迎来到美多商城&#xff01;&#xff0c;项目准备。展示用户注册页面&#xff0c;创建用户模块子应用。用户注册业务实现&#xff0c;用户注册前端逻辑。图形验证码&#xff0c;图形验证码接口设…

SQL,group by分组后分别计算组内不同值的数量

SQL&#xff0c;group by分组后分别计算组内不同值的数量 如现有一张购物表shopping 先要求小明和小红分别买了多少笔和多少橡皮&#xff0c;形成以下格式 SELECT name,COUNT(*) FROM shopping GROUP BY name;SELECT name AS 姓名,SUM( CASE WHEN cargo 笔 THEN 1 ELSE 0 END)…

关于Oracle VM VirtualBox无法查询IP地址的原因

1.如下&#xff0c;输入ifconfig却没有显示我框住的显示IP。 2.原因有可能&#xff1a; &#xff08;1&#xff09;主机没连上网络。 &#xff08;2&#xff09;虚拟机网络设置不正确。

Python问题列表

文章目录 1、使用pip安装的模块都存放到哪里了&#xff1f;2、安装fitz包报错&#xff0c;如何解决&#xff1f;3、python代码运行时&#xff0c;控制台输出乱码如何解决。4、vscode中第三方库不自动补齐 1、使用pip安装的模块都存放到哪里了&#xff1f; 答&#xff1a; pip是…

GLTFExporter是一个用于将3D场景导出为glTF格式的JavaScript库。

demo案例 GLTFExporter是一个用于将3D场景导出为glTF格式的JavaScript库。下面我将逐个讲解其入参、出参、属性、方法以及API使用方式。 入参&#xff08;Input Parameters&#xff09;: GLTFExporter的主要入参是要导出的场景对象和一些导出选项。具体来说&#xff1a; s…

Linux 入门及其基本指令(一文即入门)

目录 0 .引言 1. XShell 远程登录 Linux 1.1 云服务器 1.2. XShell 远程登陆 Linux 2. 详解 Linux 基本指令 2.1 ls 指令 2.2 pwd 指令 2.3 cd 指令 2.4 touch 指令 2.5 mkdir指令 2.6 rmdir指令 && rm 指令 0 .引言 如今&#xff0c;Linux 在服务器…

【Qt】系统相关(事件)

目录 一、概念二、事件处理三、鼠标事件1.鼠标点击事件2.鼠标释放事件3.鼠标移动事件 四、按键事件 一、概念 事件是应用程序内部或者外部产生的事情或者动作的统称。在Qt中使用一个对象来表示一个事件。所有的Qt事件均继承于抽象类QEvent。事件是由系统或者Qt平台本身在不同的…

【数据结构】——树和二叉树相关概念(全网超级详解)

创作不易&#xff0c;家人们来一波三连吧&#xff1f;&#xff01; 前言 世界上最大的树--雪曼将军树&#xff0c;这棵参天大树不是最长也不是最宽&#xff0c;是不是很奇怪&#xff0c;大只是他的体积是最大的&#xff0c;看图片肯定是感触不深&#xff0c;大家可以自己去看…

电脑卡顿怎么办?教你三招,轻松解决卡顿问题!

在现代社会&#xff0c;电脑已成为我们日常生活和工作中不可或缺的工具。然而&#xff0c;随着使用时间的增长&#xff0c;不少用户可能会遇到电脑卡顿的问题。卡顿不仅影响工作效率&#xff0c;还可能造成数据丢失等严重后果。本文将为大家介绍三种解决电脑卡顿问题的方法&…