搜索(find a way, Pots)

Find a way

思路:这一题看似简单其实不然,有很多特办条件,如果当这个M和Y都在KFC的时候就会导致步数为0 ,或者可以这样说:只有两人都能到达才能算入答案。
  我们可以使用bfs来写这道题,这不过这道题目不需要加入最后的目的地,直接将其全部bfs完,然后使用一个二维数组来存每一个地方的步数就可以了,所以需要两次bfs,需要两个二维数组来存步数。
  然后使用一个结构体数组来存终点的位置
 

我犯下的错误:第一就是bfs还是不能够熟练的使用,我们需要一个变量来存队首,还需要一个变量存改变过后的值,所以我们要插入的值是这个改变的值,而来存队首的变量的值是不能改变的,我经常将不能改变的值改变了,这就导致bfs最后所存下来的图会随着变量的增加而改变。

错误的代码:我将不能改变的变量a改变了,并且还将a给插入到队列了,这就会导致我们存在二位数组中步数就会错,好在我遇到这一题,不然我永远不会知道我错在哪里

 应该将b作为可以改变的对象,只对b进行改变,然后再将b入队。所以正确的代码应该是

 这里还有一个坑点就是输入的问题:时间超限这个问题卡了我很久,一直都不知道是错在哪里。后来在一个大佬的帮助下发现这个输入应该放在while循环中,应该是while(cin >> n >> m)   这样输入就不会导致时间超限,如果将这个放在循环里面就会导致时间超限。

最后一个坑点就是判断输出的问题,我们进行输出的时候就需要进行一个判断,这个判断应该放在最后输出的位置,当M和Y无法同时到达终点的时候不能进行输出。

最终代码如下:

#include<iostream>
#include<string>
#include<map>
#include<queue>
#include<string.h>
#define N 1000000
#define M 350
int n, m,cnt = 0;
using namespace std;
int dx[] = { -1,1,0,0 };
int dy[] = { 0,0,-1,1 };
struct node
{
	int x, y;
}exit_[N];
int step_M[M][M];
int step_Y[M][M];
bool vis[M][M];
char maze[M][M];
int M_x, M_y;
int Y_x, Y_y;
queue<node>q;

void bfs_M(int sx, int sy)
{
	memset(vis, 0, sizeof(vis));
	memset(step_M, 0, sizeof(step_M));
	struct node a, b;
	a.x = sx;
	a.y = sy;
	step_M[a.x][a.y] = 0;
	vis[sx][sy] = 1;
	q.push(a);
	while (!q.empty())
	{
		a = q.front();
		q.pop();
		vis[a.x][a.y] = 1;
		for (int i = 0; i <4; i++) {
			int tx = a.x + dx[i];
			int ty = a.y + dy[i];
			if (tx <= n && tx >= 1 && ty <= m && ty >= 1 && vis[tx][ty] == 0 && maze[tx][ty]!='#') {
				vis[tx][ty] = 1;
				step_M[tx][ty] = step_M[a.x][a.y] + 1;
				b.x = tx;
				b.y = ty;
				q.push(b);
			}
		}
	}
}
void bfs_Y(int sx, int sy)
{
	memset(vis, 0, sizeof(vis));
	memset(step_Y, 0, sizeof(step_Y));
	struct node a, b;
	a.x = sx;
	a.y = sy;
	step_Y[a.x][a.y] = 0;
	vis[sx][sy] = 1;
	q.push(a);
	while (!q.empty())
	{
		a = q.front();
		q.pop();
		vis[a.x][a.y] = 1;
		for (int i = 0; i < 4; i++) {
			int tx = a.x + dx[i];
			int ty = a.y + dy[i];
			if (tx <= n && tx >= 1 && ty <= m && ty >= 1 && vis[tx][ty] == 0&&maze[tx][ty]!= '#') {
				vis[tx][ty] = 1;
				step_Y[tx][ty] = step_Y[a.x][a.y] + 1;
				b.x = tx;
				b.y = ty;
				q.push(b);
			}
		}
	}
}
int main()
{
	while (cin >> n >> m)
	{
		cnt = 0;
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= m; j++) {
				cin >> maze[i][j];
				if (maze[i][j] == 'Y') {
					Y_x = i;
					Y_y = j;
				}
				if (maze[i][j] == 'M') {
					M_x = i;
					M_y = j;
				}
				if (maze[i][j] == '@') {
					exit_[++cnt].x = i;
					exit_[cnt].y = j;
				}
			}
			getchar();
		}
		bfs_M(M_x, M_y);
		bfs_Y(Y_x, Y_y); 
		int ans = 2147483647;
		for (int i = 1; i <= cnt; i++) {
			if (step_M[exit_[i].x][exit_[i].y] != 0 && step_Y[exit_[i].x][exit_[i].y] != 0) {
				int t_M = step_M[exit_[i].x][exit_[i].y];
				int t_Y = step_Y[exit_[i].x][exit_[i].y];
				int t = t_M + t_Y;
				ans = min(ans, t);
			}
			
		}
		cout << 11*ans << endl;
	}
}
/*
1.在主函数中输入的时候就将出口位置进行标记,使用一个结构体数组进行标记
2.对于M和Y只需要进行一次bfs即可。
*/

pots

思路:这里一共由三种操作,但是实际上是有6种操作,因为有两个杯子。我们把具体的操作抽象化为数据的操作,我们假设一个杯子的容积为a,那么fill的操作就是令a = a,drop就是使a = 0,

对于第三种操作需要具体考虑若原本a杯子的水加上b杯子的水已经超过了a的容积,那么只需要将a杯子的最大容积减去a杯子现有的容积,然后令a杯子的水等于最大容积,b杯子减去之前算过的a杯子的最大容积减去a杯子现有的容积。第二种情况:就是当b杯子装进去的水小于a杯子最大容积减去a杯子现有的水那么就使a杯子的水等于a杯子现有的水加上b杯子剩余的水。

对于b也同理。

这6种操作当成队列一次入队进行可行性判断,其终止条件是如果有一个杯子的水等于目标杯子那么就跳出循环。

#include<iostream>
#include<string>
#include<map>
#include<queue>
#include<string.h>
using namespace std;
int A, B, C;
bool vis[120][120];
struct node
{
	int a;
	int b;
	int step[100005];
	int sum;
};
bool bfs()
{
	memset(vis, 0, sizeof(vis));
	queue<node> q;
	node x, y;
	x.a = x.b = x.sum = 0;
	vis[x.a][x.b] = 1;
	q.push(x);
	while (!q.empty())
	{
		x = q.front();
		q.pop();
		if (x.a == C || x.b == C) {
			cout << x.sum << endl;
			for (int i = 1; i <= x.sum; i++) {
				if (x.step[i] == 1) cout << "FILL(1)" << endl;
				if (x.step[i] == 2) cout << "FILL(2)" << endl;
				if (x.step[i] == 3) cout << "DROP(1)" << endl;
				if (x.step[i] == 4) cout << "DROP(2)" << endl;
				if (x.step[i] == 5) cout << "POUR(1,2)" << endl;
				if (x.step[i] == 6) cout << "POUR(2,1)" << endl;
			}
			return true;
		}
		for (int i = 1; i <= 6; i++) {
			y = x;
			if (i == 1) y.a = A;
			if (i == 2) y.b = B;
			if (i == 3) y.a = 0;
			if (i == 4) y.b = 0;
			if (i == 5) {
				if (x.a + x.b <= B) {
					y.b = x.a + x.b;
					y.a = 0;
				}
				else {
					y.a = y.a - (B - y.b);
					y.b = B;
				}
			}
			if (i == 6) {
				if (x.a + x.b <= A) {
					y.a = x.a + x.b;
					y.b = 0;
				}
				else {
					y.b = y.b - (A - y.a);
					y.a = A;
				}
			}
			if (!vis[y.a][y.b]) {
				vis[y.a][y.b] = 1;
				y.sum = x.sum + 1;
				y.step[y.sum] = i;
				q.push(y);
			}
		}
	}
	return false;
}
int main()
{
	cin >> A >> B >> C;
	if (!bfs())
	{
		cout << "impossible" << endl;
	}
	return 0;
}

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

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

相关文章

ChatGPT,来一份3·28雷布斯米时捷上市发布会即时发言稿

你新招了一个秘书。上班第一天&#xff0c;你对他说&#xff1a;“3月28号我可能会受邀参加雷老板的米时捷’上市发布会&#xff0c;届时我可能会有十分钟的发言机会&#xff0c;你现在准备一篇演讲稿。” 秘书问你有何指导意见&#xff1f; 你自己都不知说啥子&#xff0c;能…

探秘 RabbitMQ 的设计理念与核心技术要点

目录 一、消息中间件介绍 1.1 消息中间件的作用 二、RabbitMQ 2.1 核心概念 2.2 生产者发送消息过程 2.3 消费者接收消息过程 2.4 RabbitMQ 为何要引入信道(channel) 2.5 消费模式 一、消息中间件介绍 消息队列中间件&#xff08;message queue middleWare, MQ&#xff09;指…

前端发版上线出现白屏问题

目录 路由配置问题资源缓存问题首屏加载过慢 &#xff1a;喂&#xff0c;你的页面白啦&#xff01; 出现上线白屏的问题有很多&#xff0c;如&#xff1a;配置错误、缓存问题、浏览器兼容问题&#xff0c;根据不同情况去解决。 路由配置问题 问题描述&#xff1a; 在vue开发…

ValueError: Cannot load file containing pickled data when allow_pickle=False

问题描述 遇到报错&#xff1a;ValueError: Cannot load file containing pickled data when allow_pickleFalse 解决方案 经过查阅有人说是与numpy的版本有关&#xff0c;但是还是不要轻易改变环境中的版本&#xff0c;不一定哪个地方就会报错。这里放个解决方案&#xff1a;…

【详细讲解yarn的安装和使用】

&#x1f308;个人主页:程序员不想敲代码啊&#x1f308; &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家&#x1f3c6; &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提…

探索MongoDB:发展历程、优势与应用场景

一、MongoDB简介 MongoDB 始于 2007 年&#xff0c;由 Dwight Merriman、Eliot Horowitz 和 Kevin Ryan –&#xff08;DoubleClick 的主理团队&#xff09;共同创立。 DoubleClick 是一家互联网广告公司&#xff08;现隶属于 Google&#xff09;&#xff0c;公司团队开发并利…

数字化转型的密码:传统企业转型路径的深度剖析

引言&#xff1a;数字经济浪潮下的新资产形态 传统行业&#xff0c;如零售、金融、教育等&#xff0c;在如今这场数字化浪潮中&#xff0c;同样需要积极拥抱变革&#xff0c;探索适合自身的转型之路。本文将结合制造业的转型经验&#xff0c;深入探讨传统行…

电脑开机0x0000007B蓝屏怎么办?

电脑开机0x0000007B蓝屏怎么办啊?相信很多用户的电脑都有遇到过蓝屏的问题,最近有用户电脑一开机就蓝屏,并且显示0x0000007B错误代码,原本想通过安全模式进行修复,结果发现安全模式进不去,不知道该怎么解决。这可能与我们的内存或硬盘有关,尝试设置一下硬盘模式,看看是…

嵌入式软件工程师都需要安装哪些软件

文章目录 一、编程软件1.keil2.vscode①Chinese&#xff1a;中文②C/C、C/C Extension Pack③CMake、CMake Tools等代码调试运行的工具④Remote-SSH等&#xff0c;关于远程登录linux服务器的插件 3.Pycharm和Anaconda&#xff0c;用来写python脚本和配置环境&#xff0c;PYQT上…

【Python】搭建 Python 环境

目 录 一.安装 Python二.安装 PyCharm 要想能够进行 Python 开发&#xff0c;就需要搭建好 Python 的环境 需要安装的环境主要是两个部分&#xff1a; 运行环境: Python开发环境: PyCharm 一.安装 Python (1) 找到官方网站 (2) 找到下载页面 选择 “Download for Windows”…

[蓝桥杯 2022 省 A] 求和

[蓝桥杯 2022 省 A] 求和 题目描述 给定 n n n 个整数 a 1 , a 2 , ⋯ , a n a_{1}, a_{2}, \cdots, a_{n} a1​,a2​,⋯,an​, 求它们两两相乘再相加的和&#xff0c;即 S a 1 ⋅ a 2 a 1 ⋅ a 3 ⋯ a 1 ⋅ a n a 2 ⋅ a 3 ⋯ a n − 2 ⋅ a n − 1 a n − 2 ⋅ a…

C语言:动态内存管理(malloc,calloc,realloc,free)

目录 前言 malloc函数 free函数 calloc函数 realloc函数 前言 在这一章节将讲解动态内存分配&#xff0c;它可以在程序的堆区创建一块内存&#xff0c;在这块内存中存什么值就是由自己决定的了 开辟的空间有两个特点&#xff1a; 1. 空间开辟的大小是固定的 2. 数组在…

零基础学习挖掘PHP网站漏洞

教程介绍 本套课程&#xff0c;分为三个阶段&#xff1a;第一阶段&#xff1a;基础篇 学习PHP开发的基础知识&#xff0c;对PHP常见的漏洞进行分析&#xff0c;第二阶段&#xff1a;进阶篇 实战PHP漏洞靶场&#xff0c;了解市面上的PHP主流网站开发技术&#xff0c;并对市面上…

JAVA获取免费天气

JAVA调用天气代码示例 前沿&#xff1a;最近在开发任务中需要获取每日的实时天气和天气预报&#xff0c;要求还是免费的。在网络上搜索了一下免费的API并有了以下思路 免费API网址&#xff1a;https://dev.qweather.com/docs/api/grid-weather/grid-weather-now/ 调用格林天…

工程企业的未来选择:Java版工程项目管理系统平台与数字化管理的融合

在现代化的工程项目管理中&#xff0c;一套功能全面、操作便捷的系统至关重要。本文将介绍一个基于Spring Cloud和Spring Boot技术的Java版工程项目管理系统&#xff0c;结合Vue和ElementUI实现前后端分离。该系统涵盖了项目管理、合同管理、预警管理、竣工管理、质量管理等多个…

基于Colab训练的yolov4-tiny自定义数据集(可用于OpenCV For Unity)

参考资料文档和视频。 1.打开文档,点击【文件】【在云端硬盘中保存一份副本】,即将文档复制到自己云端硬盘。 2.打开该文件,按文中提示进行。 【代码执行程序】【更改运行时类型】修改运行时为GPU(免费的GPU不好用,收费的好用,某宝上几十元就可用一个月) 步骤1) !git…

大数据面试题 —— Kafka

目录 消息队列 / Kafka 的好处消息队列的两种模式什么是 KafkaKafka 优缺点你在哪些场景下会选择 Kafka讲下 Kafka 的整体结构Kafka 工作原理 / 流程Kafka为什么那么快/高效读写的原因 / 实现高吞吐的原理生产者如何提高吞吐量&#xff08;调优&#xff09;kafka 消息数据积压&…

python爬虫-----输入输出与流程控制语句(第四天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

力扣:字母迷宫,python

这里写自定义目录标题 问题描述题解踩坑记录global和nonlocal关键字的区别&#xff1a;类中可以用实例变量替换全局变量 问题描述 字母迷宫游戏初始界面记作 m x n 二维字符串数组 grid&#xff0c;请判断玩家是否能在 grid 中找到目标单词 target。 注意&#xff1a;寻找单词…

【C++ leetcode】双指针(专题完结)

15. 三数之和 题目 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的…