分油问题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.mzph.cn/news/185049.shtml

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

相关文章

使用VScode通过内网穿透在公网环境下远程连接进行开发

文章目录 前言1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar内网穿透4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网地址远程 前言 远程…

能耗远程在线监测系统在工业节能提高效率

摘要&#xff1a;为保证企业实现节能减排目标&#xff0c;设计和使用远程在线监测系统势在必行。远程在线监测系统是基于传感器与网络技术的优势&#xff0c;在企业区域各个位置针对性安装传感器&#xff0c;对实时数据进行采集、编码传输到远程管理系统。远程管理系统对采集的…

版本控制系统Git学习笔记-Git基础操作

文章目录 概述一、获取仓库1.1 初始化仓库1.2 克隆仓库 二、文件状态及更新操作2.1 文件状态变化周期2.2 检查文件状态2.2.1 完整查看状态2.2.2 简要查看状态 2.3 跟踪新文件2.4 暂存已修改的文件2.5 忽略文件2.5.1 文件 .gitignore 的格式规范如下&#xff1a;2.5.2 glob模式格…

持续增长的背后,艾比森用泛微-千里聆RPA机器人为业务加速

&#xff08;艾比森全球总部&#xff09; 艾比森集团始创于2001年&#xff0c;是全球知名的至真LED显示应用与服务提供商。目前旗下设有深圳总部&#xff0c;艾比森东江智造中心&#xff0c;以及艾比森美国、德国、日本、迪拜、俄罗斯、墨西哥、巴西、中国香港等18家海内外公司…

Web应用渗透测试完全指南(二)

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

leetcode刷题详解十四

39. 组合总和 vector<vector<int>> res; vector<int> temp; vector<vector<int>> combinationSum(vector<int>& candidates, int target) {back_tracing(candidates, 0, 0, target);return res; }void back_tracing(vector<int>…

如何使用Windows自带的IIS服务搭建本地站点并远程访问

文章目录 1.前言2.Windows网页设置2.1 Windows IIS功能设置2.2 IIS网页访问测试 3. Cpolar内网穿透3.1 下载安装Cpolar内网穿透3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5.结语 1.前言 在网上各种教程和介绍中&#xff0c;搭建网页都会借助各种软件的帮助&#xf…

5款最佳替代Sketch软件,第一款简直令人叹为观止!

Sketch是Mac平台上专门为用户界面设计的矢量图形绘制工具。Sketch简单的界面背后有优秀的矢量绘图能力和丰富的插件库。但遗憾的是&#xff0c;Sketch只能在Mac平台上使用和浏览&#xff0c;是本地化工具&#xff0c;云共享功能并不完善。本文盘点了5个Sketch替代软件&#xff…

MAVEN冲突解决

MAVEN冲突解决 1.安装下面这个插件 2.安装成功点击pom文件 dependency analyzer标志&#xff0c;说明maven helper插件就安装成功 3.点击dependency analyzer之后就会进入到下面的页面 4.标记红色就是版本冲突&#xff0c;右击complie&#xff0c;排除不是使用的 5.POM 文件…

基于深度学习的表情动作单元识别综述

论文标题&#xff1a;基于深度学习的表情动作单元识别综述 作者&#xff1a;邵志文1&#xff0c;2&#xff0c;周 勇1&#xff0c;2&#xff0c;谭 鑫3&#xff0c;马利庄3&#xff0c;4&#xff0c;刘 兵1&#xff0c;2&#xff0c;姚 睿1&#xff0c;2 发表日期&#xff1a…

RabbitMQ的Web管理页面

访问页面 http://IP:15672/账号密码默认都是&#xff1a;guest 主页概览 Overview 显示当前RabbitMQ Broker的运行信息、连接信息、集群信息以及配置信息等。 连接 Connections 无论生产者还是消费者&#xff0c;都需要与RabbitMQ建立连接后才可以完成消息的生产和消费&#…

【正点原子STM32连载】 第六十一章 USB读卡器(Slave)实验摘自【正点原子】APM32F407最小系统板使用指南

1&#xff09;实验平台&#xff1a;正点原子APM32F407最小系统板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html## 第六十…

Electronica慕尼黑电子展 Samtec团队与21ic分享虎家产品与方案

【摘要/前言】 “希望但凡是能够使用到连接器的场合都有Samtec的身影” 在慕尼黑上海电子展现场&#xff0c;Samtec华东区销售经理章桢彦先生在与21ic副主编刘岩轩老师的采访中&#xff0c;如是说道。这是一种愿景&#xff0c;更是Samtec的努力方向。短短一句话&#xff0c;…

notepad++ 插件JSONView安装

1&#xff0c;前提 开发过程中经常需要处理json格式语句&#xff0c;需要对json数据格式化处理&#xff0c;因为使用的是虚拟机内开发&#xff0c;所以没法连接外网&#xff0c;只能在本地电脑下载插件后&#xff0c;然后上传到虚拟机中&#xff0c;进行安装使用。 2&#xf…

1+x中级网络运维实验题

任务 1&#xff1a; 设备命名 为了方便后期维护和故障定位及网络的规范性&#xff0c;需要对网络设备进行规范化命名。请根据 Figure 3-1 实验考试拓扑对设备进行命名。命名规则为&#xff1a;城市-设备的设置地点-设备的功能属性和序号-设备型号。例如&#xff1a;处于杭州校…

@Autowired注解获取对象为null

问题再现 兄弟们&#xff0c;看见了吗&#xff1f;这里我Autowired进来的forkliftService 居然为null 且我SysForkliftServiceImpl上面是加了Service注解的 分析原因 主要原因就是因为该类继承了一个第三方框架SimpleChannelInboundHandler&#xff0c;在执行的过程中&#…

2023年【P气瓶充装】找解析及P气瓶充装复审模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 P气瓶充装找解析参考答案及P气瓶充装考试试题解析是安全生产模拟考试一点通题库老师及P气瓶充装操作证已考过的学员汇总&#xff0c;相对有效帮助P气瓶充装复审模拟考试学员顺利通过考试。 1、【多选题】CNG双燃料汽车…

【IEEE独立出版】2024第四届神经网络、信息与通信工程国际学术会议(NNICE 2024)

2024第四届神经网络、信息与通信工程国际学术会议&#xff08;NNICE 2024&#xff09; 2024 4th International Conference on Neural Networks, Information and Communication Engineering 2024第四神经网络、信息与通信工程国际学术会议&#xff08;NNICE 2024&#xff0…

电商API接口对于实现电商系统平台的搭建有哪些作用?

电商API接口用于实现电商平台的数据交互和功能调用。具体来说&#xff0c;电商API接口可以用于以下几个方面&#xff1a; 1. 商品管理&#xff1a;通过API接口&#xff0c;可以实现商品的添加、修改、删除、查询等操作。商家可以通过API接口将自己的商品信息上传到电商平台&…

三、Linux高级命令

目录 1、重定向命令 1.1 重定向 > 1.2 重定向 >> 该章节的所有操作都在/export/data/shell目录进行&#xff0c;请提前创建该目录。 mkdir -p /export/data/ 1、重定向命令 1.1 重定向 > Linux 允许将命令执行结果重定向到一个文件&#xff0c;本应显示在…