分油问题C++求解

news2024/11/17 11:45:36

原题

3个油桶,容量分别为(大桶)20,(中桶)9,(小桶)7,初始时大桶满油,如何操作可以分出17的油?

代码

#include<iostream>
#include<cmath>
#include<queue>
#include<set>
using namespace std;

class R {
	public:
		int l,v;
};

class T {
	public:
		R a,b,c;
		int last;
		string xw;
		T(R a,R b,R c):a(a),b(b),c(c) {
		}
		T(R a,R b,R c,int last,string xw):a(a),b(b),c(c),last(last),xw(xw) {
		}
		int id() {
			return a.v*100+b.v*10+c.v;
		}
};

void go(R *r1,R *r2) {
	int v=r2->v+r1->v;
	v=min(v,r2->l);
	int cha=v-r2->v;
	r2->v=v;
	r1->v-=cha;
}

void dfs(vector<T> vt,T t) {
	if(t.last==-1){
		cout<<t.xw<<" ==>> "<<t.a.v<<","<<t.b.v<<","<<t.c.v<<endl;
		return;
	}
	dfs(vt,vt[t.last]);
	cout<<t.xw<<" ==>> "<<t.a.v<<","<<t.b.v<<","<<t.c.v<<endl;
}

int main(int argc,char** argv) {

	R a,b,c;
	a.l=20;
	a.v=20;
	b.l=9;
	b.v=0;
	c.l=7;
	c.v=0;

	int targetV=17;

	T t(a,b,c,-1,"init");
	set<int> s;
	queue<T> q;
	q.push(t);
	s.insert(t.id());
	vector<T> vt;

	while(!q.empty()) {
		t=q.front();
		q.pop();
		if(t.a.v==targetV || t.b.v==targetV || t.c.v==targetV) {
			cout<<"Success"<<endl;
			dfs(vt,t);
			break;
		}

		vt.push_back(t);
		int last=vt.size()-1;

		a=t.a;
		b=t.b;
		c=t.c;

		if(a.v>0) {
			if(b.v<b.l) {
				T temp(a,b,c,last,"a->b");
				go(&(temp.a),&(temp.b));
				int id=temp.id();
				if(s.find(id)==s.end()) {
					q.push(temp);
					s.insert(id);
				}
			}
			if(c.v<c.l) {
				T temp(a,b,c,last,"a->c");
				go(&(temp.a),&(temp.c));
				int id=temp.id();
				if(s.find(id)==s.end()) {
					q.push(temp);
					s.insert(id);
				}
			}
		}

		if(b.v>0) {
			if(a.v<a.l) {
				T temp(a,b,c,last,"b->a");
				go(&(temp.b),&(temp.a));
				int id=temp.id();
				if(s.find(id)==s.end()) {
					q.push(temp);
					s.insert(id);
				}
			}
			if(c.v<c.l) {
				T temp(a,b,c,last,"b->c");
				go(&(temp.b),&(temp.c));
				int id=temp.id();
				if(s.find(id)==s.end()) {
					q.push(temp);
					s.insert(id);
				}
			}
		}

		if(c.v>0) {
			if(a.v<a.l) {
				T temp(a,b,c,last,"c->a");
				go(&(temp.c),&(temp.a));
				int id=temp.id();
				if(s.find(id)==s.end()) {
					q.push(temp);
					s.insert(id);
				}
			}
			if(b.v<b.l) {
				T temp(a,b,c,last,"c->b");
				go(&(temp.c),&(temp.b));
				int id=temp.id();
				if(s.find(id)==s.end()) {
					q.push(temp);
					s.insert(id);
				}
			}
		}
	}

	return 0;
}

运行

解析

1.每个桶有它的容量以及目前油量,数据结构定义为

class R {
	public:
		int l,v;
};

 表示容量和油量

2.每次操作可以从一个非空桶尽可能倒油到另一个非满桶【因为倒到满桶没有意义】,这个一定要理解,倒油实现函数为

void go(R *r1,R *r2) {
	int v=r2->v+r1->v;
	v=min(v,r2->l);
	int cha=v-r2->v;
	r2->v=v;
	r1->v-=cha;
}

因为被倒入的桶容量有限,所以要做个较小值判断

3.每完成一次倒油操作,做一次记录,记录下当前3个油桶的油量,以及这个操作【从哪个桶倒入另一个桶的】,数据结构定义为

class T {
	public:
		R a,b,c;
		int last;
		string xw;
		T(R a,R b,R c):a(a),b(b),c(c) {
		}
		T(R a,R b,R c,int last,string xw):a(a),b(b),c(c),last(last),xw(xw) {
		}
		int id() {
			return a.v*100+b.v*10+c.v;
		}
};

其中我们求解出结果之后需要将这些操作都打印出来,所以需要一个列表来存储我们的步骤

vector<T> vt;

那么T.last这个属性就是上一步操作在列表中的下标,方便查找

T.xw表示上一步操作的行为,若T.xw=="a->b",则表示油从a桶倒入b桶。

4.开一个队列来模拟倒油过程,直到有一个操作满足我们的需求,打印倒油过程并退出。

5.有可能没有方案做得到,所以我们需要对每次的方案做标识,避免重复的局面入队,比如:我刚将大桶的油倒入小桶,此时从[20,0,0]=>[13,0,7],紧接着又把油从小桶倒回大桶,这种情况我们需要排除掉,其中T.id这个函数就是表示状态的标识,只要三个桶的油量出现过这种状况,就表示已经做过类似的操作了,此时这个操作就不要入队了。

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

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

相关文章

Unity中Shader编译目标级别

文章目录 前言一、Shader Model二、Shader编译目标级别法1&#xff1a; #pragma target 3.0法2&#xff1a;#pragma require integers geometry 三、测试代码 前言 针对不同平台的特性&#xff0c;所做的一些功能 一、Shader Model ShaderModel 由微软提出&#xff0c;要求显…

【LeetCode】栈和队列OJ题---C语言版

栈和队列OJ题 1.括号匹配问题&#xff08;1&#xff09;题目描述&#xff1a;&#xff08;2&#xff09;思路表述&#xff1a;&#xff08;3&#xff09;代码实现&#xff1a; 2.用队列实现栈&#xff08;1&#xff09;题目描述&#xff1a;&#xff08;2&#xff09;思路表述&…

java double类型保留两位小数并去除后面多余的0

public static void main(String[] args) {double value9.100001;//保留两位小数String format String.format("%.2f", value);//去除多余的0String strValue new BigDecimal(format).stripTrailingZeros().toPlainString();System.out.println("strValue &q…

三维模型重建中地面控制点刺点输入常见问题及解决方法

三维模型重建中地面控制点刺点输入常见问题及解决方法 在倾斜摄影三维模型重建中&#xff0c;地面控制点的人工刺点输入是一个重要的环节。然而&#xff0c;这个过程可能会遇到一些常见问题。以下是一些常见问题及相应的解决方法&#xff1a; 1、问题&#xff1a;标定点位置不…

48、Flink DataStream API 编程指南(1)- DataStream 入门示例

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…

webpack优化打包速度

webpack打包速度太慢 优化 1.多线程打包 js压缩和loader 2.优化启动速度 hard-source-webpack-plugin 3.删除无用的 分析类插件 4.DllPlugin通道打包 1.webpack多线程打包 loader loader 使用 thread-loader 将他放置你要使用的loader前面就行&#xff0c;不过这个lorder例如s…

第二证券:股票几点到几点开盘?

作为股民或许投资者&#xff0c;我们都知道股票是每天都有开盘和收盘时间的。但是&#xff0c;关于股票的开盘时间&#xff0c;很多人并不是很清楚&#xff0c;特别是初学者。在本文中&#xff0c;我们将从多个视点分析股票开盘时间&#xff0c;并为大家供给一些有用的信息。 …

Pytorch从零开始实战11

Pytorch从零开始实战——ResNet-50V2算法实战 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——ResNet-50V2算法实战环境准备数据集模型选择开始训练可视化总结 环境准备 本文基于Jupyter notebook&#xff0c;使用Python3.8&#xff0c;Pyt…

Thread的基础用法

作者简介&#xff1a; zoro-1&#xff0c;目前大二&#xff0c;正在学习Java&#xff0c;数据结构&#xff0c;mysql&#xff0c;数据结构&#xff0c;javaee等 作者主页&#xff1a; zoro-1的主页 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&…

竞赛云平台助力华东空管局远程知识竞赛

民航华东空管局“安康杯”第三届机关综合管理能力大赛采取远程线上方式进行&#xff0c;所有选手均不在同一个地方&#xff0c;不仅节省了成本&#xff0c;同时也大大简化了赛事组织工作。借助“赛易”这样的线上知识竞赛云平台&#xff0c;其实线上竞赛可以办得象线下一样高端…

Linux学习笔记 CenOS6.3 yum No package xxx available

环境CenOS [roothncuc ~]# cat /etc/issue CentOS release 6.2 (Final) Kernel \r on an \m安装gcc的时候提示没有包 [roothncuc ~]# sudo yum install gcc gcc-c libstdc-devel Loaded plugins: refresh-packagekit, security Setting up Install Process No package gcc a…

《PFL》论文阅读笔记

一、概要 随着联邦学习的发展&#xff0c;简单的聚合算法已经不在有效。但复杂的聚合算法使得联邦学习训练时间出现新的瓶颈。本文提出了并行联邦学习&#xff08;parallel federated learning&#xff0c;PFL&#xff09;&#xff0c;通过调换中心节点聚合和广播的顺序。本文…

行业研究:2023年氟化钾发展前景及细分市场分析

氟化工产品&#xff0c;作为化工新材料之一&#xff0c;在“十二五”规划被单列一个专项规划。由于产品具有高性能、高附加值&#xff0c;氟化 工产业被称为黄金产业。 氟是一种盐&#xff0c;有一种叫做钾的腐化盐&#xff0c;这种产品是白色结晶&#xff0c;易吸收&#xff0…

基于Springboot的房产销售系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的房产销售系统(有报告)。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Sp…

飞书全新版本搭载AI智能伙伴,支持用户自选底层大模型!

原创 | 文 BFT机器人 近日&#xff0c;字节跳动旗下飞书正式发布“飞书智能伙伴”系列AI产品。此次新产品有专属、易协作、有知识、有记忆、更主动等特点。除此之外&#xff0c;“飞书智能伙伴”作为一个开放的AI服务框架&#xff0c;各企业可根据业务场景自主选择适合的底层大…

图扑软件受邀出席高交会-全球清洁能源创新博览会

“相聚鹏城深圳&#xff0c;共享能源盛宴” 第二十五届中国国际高新技术成果交易会(简称“高交会”)于 11 月 15-18 日在深圳盛大开幕。高交会由商务部、科学技术部、工业和信息化部、国家发展改革委、农业农村部、国家知识产权局、中国科学院、中国工程院和深圳市人民政府共同…

从0开始学习JavaScript--JavaScript 工厂模式

JavaScript 工厂模式是一种强大的设计模式&#xff0c;它提供了一种灵活的方式来创建对象。本文将深入讨论工厂模式的基本概念、多种实现方式以及在实际应用中的各种场景。 工厂模式的基本概念 工厂模式旨在通过一个函数或方法来创建对象&#xff0c;而不是通过类直接实例化。…

使用Python脚本实现图片合成PDF功能

目录 一、所需库 二、图片合成PDF的实现过程 三、完整的代码示例 四、注意事项 总结 在Python中&#xff0c;我们可以使用一些强大的库来实现图片合成PDF的功能。这个过程主要包括读取图片文件、将图片按照指定的顺序合并以及生成PDF文件。下面&#xff0c;让我们一起探索…

用Metasploit进行信息收集2

基于FTP协议收集信息 1.查看ftp服务的版本信息 打开metasploit 查看ftp版本的模块&#xff0c;并进入模块 msf6 > search ftp_version msf6 > use auxiliary/scanner/ftp/ftp_version msf6 auxiliary(scanner/ftp/ftp_version) > show options 查看靶机的端口开方情…

switch....case击穿| return 和break的区别

1、我们首先要明白switch..case的语法使用&#xff1a; 执行流程&#xff1a;首先计算switch后面圆括号中表达式的值&#xff0c;然后用此值依次与各个case的常量表达式比较,若圆括号中表达式的值与某个case后面的常量表达式的值相等,就执行此case后面的语句,执行后遇break语句…