分油问题C++求解

原题

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.mfbz.cn/a/200958.html

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

相关文章

【复盘】接口自动化测试框架建设的经验与教训!

为什么选择这个话题&#xff1f; 一是发现很多“点工”在转型迷茫期都会问一些自动化测试相关的问题&#xff0c;可以说自动化测试是“点工”升级的必经之路&#xff1b;二是Google一下接口自动化测试&#xff0c;你会发现很多自动化测试框架相关的文章&#xff0c;但是大部分…

自动化测试框架搭建步骤教程

说起自动化测试&#xff0c;我想大家都会有个疑问&#xff0c;要不要做自动化测试&#xff1f; 自动化测试给我们带来的收益是否会超出在建设时所投入的成本&#xff0c;这个嘛别说是我&#xff0c;即便是高手也很难回答&#xff0c;自动化测试的初衷是美好的&#xff0c;而测试…

golang channel执行原理与代码分析

使用的go版本为 go1.21.2 首先我们写一个简单的chan调度代码 package mainimport "fmt"func main() {ch : make(chan struct{})go func() {ch <- struct{}{}ch <- struct{}{}}()fmt.Println("xiaochuan", <-ch)data, ok : <-chfmt.Println(&…

Xiamen I Fitness Platform

厦门I健身平台程 https://ijs.sports.xm.gov.cn/mgh5/#/ 1&#xff09;公众号 2&#xff09;主页 3&#xff09;【个人中心】【我的保险】就是要买一份保险&#xff0c;10元的那种&#xff0c;不然去场地出意外咋办 4&#xff09;我的保险状态&#xff1a;未购买&#xff0c;…

VR虚拟教育展厅,为教学领域开启创新之路

线上虚拟展厅是一项全新的展示技术&#xff0c;可以为参展者带来不一样的观展体验。传统的实体展览存在着空间限制、时间限制以及高昂的成本&#xff0c;因此对于教育领域来说&#xff0c;线上虚拟教育展厅的出现&#xff0c;可以对传统教育方式带来改革&#xff0c;凭借强大的…

【Qt之QSqlRelationalDelegate】描述及使用

描述 QSqlRelationalDelegate类提供了一个委托&#xff0c;用于显示和编辑来自QSqlRelationalTableModel的数据。 与默认委托不同&#xff0c;QSqlRelationalDelegate为作为其他表的外键的字段提供了一个组合框。 要使用该类&#xff0c;只需在带有QSqlRelationalDelegate实例…

easyrecovery如何恢复手机数据及硬盘数据恢复方法

EasyRecovery16是一款优秀的数据恢复软件&#xff0c;不仅能够兼容windows和mac双重系统&#xff0c;同时还能够识别u盘、存储卡、手机等多种数据储存设备&#xff0c;可恢复的文件类型更是多达百余种。还贴心地准备个人版、专业版和企业版的下载&#xff0c;增加了用户的可选性…

Android-P CameraSerivce

0 前言 本文重点分析Android-P的CameraService实现。 验证:Goldfish模拟器 1 定义 图1.1 CameraService ICameraServiceframeworks/av/camera/aidl/android/hardware/ICameraService.aidlBnCameraServiceout/soong/.intermediates/frameworks/av/camera/libcamera_client/an…

通过分析波形,透彻理解 UART 通信

UART是一种异步全双工串行通信协议&#xff0c;由 Tx 和 Rx 两根数据线组成&#xff0c;因为没有参考时钟信号&#xff0c;所以通信的双方必须约定串口波特率、数据位宽、奇偶校验位、停止位等配置参数&#xff0c;从而按照相同的速率进行通信。 异步通信以一个字符为传输单位…

远程访问:Windows设备管理器远程访问

设备管理器是一个应用程序&#xff0c;它包含与计算机耦合的硬件的完整概述&#xff0c;远程设备管理器允许管理员访问远程计算机的设备管理器&#xff0c;而无需远程访问桌面。 为什么需要远程设备管理器 IT环境充斥着数量众多的电脑和笔记本电脑&#xff0c;对于管理员来说…

Abaqus飞机起落架扭力臂拓扑优化

Abaqus飞机起落架扭力臂拓扑优化 Abaqus除了可以对结构进行强度分析&#xff0c;同样也自带强大的优化功能&#xff0c;下面通过一个简 单的实例演示在Abaqus中进行拓扑优化&#xff0c;另外&#xff0c;如果需要更加强大的拓扑优化仿真&#xff0c;可以 在TOSCA中进行。 定义接…

30岁的测试人?软件测试“内卷“?“我“该如何冲出破圈...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、软件测试的内卷…

怎么样的软件测试工程师才算“大神”?

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

数据集笔记 :PEMS-BAY

数据地址&#xff1a;DCRNN - Google 云端硬盘 各station 位置&#xff1a;DCRNN/data/sensor_graph/graph_sensor_locations_bay.csv at master liyaguang/DCRNN (github.com) 1 读取 数据 import h5py fileDownloads/pems-bay.h5fh5py.File(file,r) f.keys()f[speed] #&…

Linux系统iptables

目录 一. 防火墙简介 1. 防火墙定义 2. 防火墙分类 ①. 网络层防火墙 ②. 应用层防火墙 二. iptables 1. iptables定义 2. iptables组成 ①. 规则表 ②. 规则链 3. iptables格式 ①. 管理选项 ②. 匹配条件 ③. 控制类型 四. 案例说明 1. 查看规则表 2. 增加新…

事务基础知识

文章目录 1. 事务的ACID2. 事务隔离级别2.1 数据并发问题2.2 MySQL中的四种隔离级别 1. 事务的ACID 原子性&#xff08;atomicity&#xff09;&#xff1a; 原子性是指事务是一个不可分割的工作单位&#xff0c;要么全部提交&#xff0c;要么全部失败回滚。一致性&#xff08;…

专业的调查问卷平台推荐:提升数据收集与分析效率

无论是学生还是职场人士&#xff0c;想做好一份调查问卷&#xff0c;关键先要确定调查的主题&#xff0c;然后确定调查人群&#xff0c;编辑问题&#xff0c;最后能够尽可能的美化问卷调查的主题。 想要做到这几点&#xff0c;就要要求问卷调查平台: 1、能够帮助你快速制作出一…

初学者如何理解​session、cookie、token的区别与联系?

session、cookie、token。 相信学过接口的朋友都特别熟悉了。 但是对我一个刚接触接口测试的小白来说&#xff0c;属实有点分不清楚。 下文就是我通过查阅各种资料总结出来的一点理解&#xff0c;不准确的地方还请各位指正。 &#xff08;文末送洗浴中心流程指南&#xff09…

面试题:说一下MyBatis动态代理原理?

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.MyBatis简介2.使用步骤2.1、引入依赖2.2、配置文件2.3、接口定义2.4、加载执行 3.原理解析 1.MyBatis简介 MyBatis是一个ORM工具&#xff0c;封装了JDBC的操作&a…

大数据机房迁移该按照什么步骤进行 |数据中心

前言&#xff1a; 机房搬迁不仅仅是把机房的设备迁移到新机房那么简单&#xff0c;而是要求网络系统的迁移和集中存储系统的迁移必须安全平稳&#xff0c;不能过长时间影响生产应用。表面上就是几个IT 民工的搬运&#xff0c;但实际是一项目高度集中的体力与脑力的综合项目。现…