分油问题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.hqwc.cn/news/234303.html

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

相关文章

【古月居《ros入门21讲》学习笔记】18_常用可视化工具的使用

目录 说明&#xff1a; 1. Qt工具箱 日志输出工具&#xff1a;rqt_console 绘制数据曲线&#xff1a;rqt_plot 图像渲染工具&#xff1a;rqt_image_view 综合工具&#xff1a;rqt 2. 三维可视化工具&#xff1a;Rviz Rviz启动 使用示例 3. 仿真平台&#xff1a;Gazebo…

企业数字化转型应对传统网络挑战的关键策略

数字化变革正在以前所未有的速度和规模改变着我们的生活和工作方式&#xff0c;使得传统网络架构面临着巨大的挑战。其中包括带宽需求增加、多云应用增加、安全威胁增加以及传统网络设备无法满足需求等问题。 数字化时代需要更高速、更可靠、更安全的网络支持&#xff0c;传统网…

制造企业建设数字工厂管理系统的难点主要有哪些

随着科技的飞速发展&#xff0c;制造企业正面临着从传统生产模式向数字化、智能化转型的挑战。其中&#xff0c;建设数字工厂管理系统是实现这一目标的重要途径。然而&#xff0c;在实际操作过程中&#xff0c;制造企业往往会遇到一系列难点。本文将对这些难点进行详细的分析。…

Oracle--索引

文章目录 一、索引是什么?二、索引的原理三、索引的特征四、创建索引的方式五、怎么确认索引六、案列七、复合索引 一、索引是什么? 索引&#xff08;INDEX&#xff09;是数据库中用于提高查询效率的一种数据结构。它可以加速数据库表的数据查找、过滤和排序等操作。索引是一…

Python数据清洗--运用3δ准则检测异常值

1.3δ准则检测异常值的基本原理 当数据为连续型变量、服从或近似服从正态分布时&#xff0c;可运用3δ准则检测异常值。在该准则条件下&#xff0c;数据值与均值的偏差如果超过标准差的3倍&#xff0c;那么该数据值就会被视为异常值。即针对样本xi&#xff0c;如果满足&#x…

【深度学习】KMeans中自动K值的确认方法

1 前言 聚类常用于数据探索或挖掘前期&#xff0c;在没有做先验经验的背景下做的探索性分析&#xff0c;也适用于样本量较大情况下的数据预处理等方面工作。例如针对企业整体用户特征&#xff0c;在未得到相关知识或经验之前先根据数据本身特点进行用户分群&#xff0c;然后再…

Pinia仓库统一管理

pinia独立维护 在src/stores文件夹下创建index.js文件&#xff0c;将main.js中关于pinia的语句放到index.js中 index.js文件内容&#xff1a; import { createPinia } from pinia import piniaPluginPersistedstate from pinia-plugin-persistedstate const pinia createPi…

基于javaweb的宠物服务商城系统设计与开发

摘 要 最近几年以来&#xff0c;宠物在人们的日常生活中所占的地位越来越重要了&#xff0c;它们不仅仅是我们的朋友&#xff0c;也成为了我们家庭中的一份子。21世纪&#xff0c;信息技术飞速发展&#xff0c;计算机行业日新月异&#xff0c;极大地带动了信息的流动&#xff…

新建的springboot项目中application.xml没有绿色小叶子(不可用)

经常有朋友会遇到新建了一个springboot项目&#xff0c;发现为啥我创建的application.xml配置文件不是绿色的&#xff1f;&#xff1f;&#xff1f; 下面教大家如何解决&#xff0c;这也是博主在做测试的时候遇到的&#xff1a; 将当前位置application.xml删掉&#xff0c;重新…

智慧环保:视频监控平台EasyCVR与AI智能分析在环保领域的应用

人工智能&#xff08;AI&#xff09;视频分析技术在环保领域有着广泛的应用&#xff0c;通过智能识别和跟踪技术&#xff0c;AI视频分析可以实时监测空气质量、水质和噪音等环境指标&#xff0c;帮助环保部门及时发现污染源并进行有效治理&#xff0c;提高监测、管理和保护环境…

深入学习redis-基于Jedis通过客户端操作Redis

目录 redis客户端&#xff08;JAVA&#xff09; 配置 引入依赖 建立连接 常用命令实现 get/set exists/del keys expire和ttl type 字符串&#xff08;String&#xff09; mget和mset getrange和setrange append incr和decr 列表&#xff08;list&#xff09; …

明确技术和质量管理工作的主管领导、技术和质量管理机构的负责人。技术和质量管理机构负责人应当具备中级及以上测绘专业技术职称

明确技术和质量管理工作的主管领导、技术和质量管理机构的负责人。技术和质量管理机构负责人应当具备中级及以上测绘专业技术职称 1.技术和质量管理工作主管领导、技术和质量机构负责人的任命文件 2.技术和质量机构负责人的专业技术职称