分油问题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,一经查实,立即删除!

相关文章

批量登录和防关联:管理大量VK账号的有效方法

批量登录和管理大量VK账号是一项具有挑战性的任务&#xff0c;尤其是要防止账号之间产生关联。本文将介绍VK多账号的优势&#xff0c;并提供有效的方法来管理大量VK账号并防止关联。 一、VK是什么&#xff1f; VK&#xff08;全称Vkontakte&#xff09;是俄罗斯最大的社交媒体…

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

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

TEMU灯具资质管控CE-ROHS(含铅邻苯)可以替代RSLreport (铅) +RSL report (邻)

TEMU各国灯具资质管控&#xff0c;UL CE-EMC/LVD RSL-SCCP PSE 灯具类产品UL认证/UL测试报告&#xff1a; 美国是一个对安全要求非常严格的国家&#xff0c;美国本土的所有电子产品生产企业早在很多年前就要求有相关安规检测。 针对这个情况&#xff0c;美国相关部门发布了专门…

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

摘要&#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模式格…

【C 语言经典100例】C 练习实例30 - 回文数

题目&#xff1a;一个5位数&#xff0c;判断它是不是回文数。即12321是回文数&#xff0c;个位与万位相同&#xff0c;十位与千位相同。 程序分析&#xff1a;学会分解出每一位数。 #include <stdio.h>int main( ) {long ge,shi,qian,wan,x;printf("请输入 5 位数…

[EFI]MSI GF63 Thin 9SCXR电脑 Hackintosh 黑苹果efi引导文件

硬件型号驱动情况主板 MSI GF63 Thin 9SCXR 处理器Intel Core i7-9750H已驱动内存16GB DDR4 3200MHz已驱动硬盘KINGSTON NVMe Gen3 512GB已驱动显卡核显已驱动声卡Realtek ALC 235已驱动网卡Realtek RTL8168已驱动无线网卡蓝牙Intel Wi-Fi AX201需要自行根据系统版本添加对应驱…

记录 | pip加速配置

以下方法不仅适用于linux&#xff0c;也适用于mac 临时加速配置&#xff1a; pip install -i https://pypi.douban.com/simple --trusted-host pypi.douban.com matplotlib3.4.0其中可选源有&#xff1a; https://pypi.douban.com/simple http://mirrors.aliyun.com/pypi/sim…

vue3+vite打包自动生成dist.zip文件

第一步&#xff1a;先安装插件 npm i jszip -D npm i jszip -D npm i vite-plugin-compression -D第二步&#xff1a;在根目录下面创建一个zip.js文件&#xff08;和vite.config.js同一级&#xff09; // eslint-disable-next-line func-names const plugin function (fileN…

持续增长的背后,艾比森用泛微-千里聆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…

Day43:123.买卖股票的最佳时机III、188.买卖股票的最佳时机IV

文章目录 123.买卖股票的最佳时机III思路代码实现 188.买卖股票的最佳时机IV思路代码实现 123.买卖股票的最佳时机III 题目链接 思路 这道题规定了买卖次数只能为2&#xff0c;直接把两次过程分开&#xff0c;分为四层&#xff0c;分别为&#xff1a; 第一次持有股票第一次…

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

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

在windows上使用多个版本的chrome(谷歌)浏览器

1、下载离线安装包&#xff0c;地址为&#xff1a;版本99- https://download.csdn.net/download/xiaozukun/88583844 或&#xff0c;版本121- https://download.csdn.net/download/xiaozukun/88583876 2、下载后解压缩&#xff0c;在解压后的文件下新建名为“user-data”的文…

对c语言的认识(基础语法知识请见笔者之前文章)

底层逻辑&#xff1a; 1.c语言的整体思想&#xff1a;面向过程&#xff0c;而问题的实现过程是解题时的主要难点&#xff0c;与其花时间分析问题结果&#xff0c;不如研究问题的过程 2.变量的初始化与赋值&#xff1a;初始化为变量的初值&#xff0c;通常表示为0或者其他的数&a…

MAVEN冲突解决

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

基于JavaScript的jimp库处理图片,添加绘制点

Jimp 是一个用于在 Node.js 环境下进行图像处理的 JavaScript 库。要在图片上绘制点并控制点的大小和颜色&#xff0c;你可以使用 Jimp 库的相关方法来实现。 这里来看介绍吧&#xff0c;英文不好的找翻译gpt和度娘应该都不错 GitHub - jimp-dev/jimp: An image processing l…

【量子机器学习】量子机器学习的介绍

量子机器学习&#xff1a;解锁未来的计算潜能 随着科技的迅速进步&#xff0c;量子机器学习&#xff08;QML&#xff09;作为量子计算和机器学习的完美融合&#xff0c;为我们带来了前所未有的计算潜能。在这个新兴领域中&#xff0c;量子神经网络&#xff08;QNN&#xff09;…