容器里有10升油,现在只有两个分别能装3升和7升油的瓶子,需要将10 升油等分成2 个5 升油。编写程序,输出分油的操作过程。

这个思路是看别人的,代码是自己写的
思路其实很容易理解,就是三个桶之间互相倒油,直到倒出想要的结果,也就是其中任意一个桶中出现5即可。难就难在,如果直接让三个桶互相倒的话,很容易出现死循环,也就是a倒到b,下一步的时候,有让b倒回到a,所以要防止这种
情况的出现,才能找到结果。

解决方法:先倒,然后看看三个桶中容量的状态,和前面的三个桶的状态是否有相同,若有,则不让这步进行,没有,则可以倒油。

#include <iostream>
#include <vector>
using namespace std;
vector<int*> arr; //用来存放所有情况, int*数组里按tank,bottle1,bottle2存放
int TANK, BOTTLE_1, BOTTLE_2;int* show(string str)
{cout << str << endl;return NULL;
}int* generate(int *p_)
{int* p = new int[3]();*p = *p_;*(p + 1) = *(p_+1);p[2] = p_[2];arr.push_back(p);return p;
}bool judge(int * p)
{for (int i = 0; i < arr.size(); i++){if (arr[i][0] == p[0] && arr[i][1] == p[1] && arr[i][2] == p[2])return false;}return true;
}void pourOil(int tank, int bottle_1, int bottle_2)     //
{//int tank_ = tank, bottle_1_ = bottle_1, bottle_2_ = bottle_2;int p[3] = { tank ,bottle_1 ,bottle_2 };if (tank - (BOTTLE_1 - bottle_1) < 0)        //tank -> bottle_1{p[1] += p[0];p[0] = 0;}else{p[0] = tank - (BOTTLE_1 - bottle_1);p[1] = BOTTLE_1;}judge(p) ? generate(p) : 0;p[0] = tank, p[1] = bottle_1, p[2] = bottle_2;        //tank -> bottle_2if (tank - (BOTTLE_2 - bottle_2) < 0){p[2] += p[0];p[0] = 0;}else{p[0] = tank - (BOTTLE_2 - bottle_2);p[2] = BOTTLE_2;}judge(p) ? generate(p) : 0;p[0] = tank, p[1] = bottle_1, p[2] = bottle_2;    //bottle_1->tankp[0] += p[1];p[1] = 0;judge(p) ? generate(p) : 0;p[0] = tank, p[1] = bottle_1, p[2] = bottle_2;    //bottle_2->tankp[0] += p[2];p[2] = 0;judge(p) ? generate(p) : 0;p[0] = tank, p[1] = bottle_1, p[2] = bottle_2;    //bottle_1->bottle_2if (bottle_1 - (BOTTLE_2 - bottle_2) < 0){p[2] += p[1];p[1] = 0;}else{p[1] = bottle_1 - (BOTTLE_2 - bottle_2);p[2] = BOTTLE_2;}judge(p) ? generate(p) : 0;;p[0] = tank, p[1] = bottle_1, p[2] = bottle_2; //bottle_2 -> bottle_1if (bottle_2 - (BOTTLE_1 - bottle_1) < 0){p[1] += p[2];p[2] = 0;}else{p[2] = bottle_2 - (BOTTLE_1 - bottle_1);p[1] = BOTTLE_1;}judge(p) ? generate(p) : 0;}int main() {//int tank, bottle_1, bottle_2;//TANK = 10, BOTTLE_1 = 2, BOTTLE_2 = 8;cin >> TANK >> BOTTLE_1 >> BOTTLE_2;int* p = new int[3]();//10个值初始化为0的int*p = TANK;*(p + 1) = 0;*(p + 2) = 0;arr.push_back(p);for (int i=0;i<arr.size();i++){cout << arr.size() << " " ;pourOil(arr[i][0],arr[i][1],arr[i][2]);}cout << endl;int flag = 0;for (int i = 0; i < arr.size(); i++){for (int j = 0; j < 3; j++)cout << arr[i][j] << " ";if (arr[i][0] == TANK / 2 && arr[i][2] == TANK / 2){flag = 1;cout << endl<<"有解";break;}cout << endl;}flag?cout << "" :cout << "无解";}//for (auto val : arr)
//{//  for (int i = 0; i < 3; i++)
//      cout << *(val + i) << endl;
//}
//for (vector<int*>::const_iterator iter = arr.begin(); iter != arr.end(); iter++)
//{//  for (int i = 0; i < 3; i++)
//      cout << *(*iter + i) << endl;
//}
//for (auto iter = arr.begin(); iter != arr.end(); iter++)
//{//  for (int i = 0; i < 3; i++)
//      cout << *(*iter + i) << endl;
//}
//for (int i = 0; i < arr.size(); i++)
//{//  for (int j = 0; j < 3; j++)
//      cout << arr[i][j] << endl;
//}

容器里有10升油,现在只有两个分别能装3升和7升油的瓶子,需要将10 升油等分成2 个5 升油。编写程序,输出分油的操作过程。相关推荐

  1. 容器里有10升油,现在只有两个分别能装3升和7升油的瓶子,需要将10 升油等分成2 个5 升油。程序输出分油次数最少的详细操作过程

    引入 1.容器里有10升油,现在只有两个分别能装3升和7升油的瓶子,需要将10 升油等分成2 个5 升油.程序输出分油次数最少的详细操作过程. 思考 这题主要是要求了输出分油次数最少的操作,网上很多算 ...

  2. 将一张100元的钞票换成1元、5元和10元的钞票,每种钞票至少一张,编写程序输出所有的换法,循环次数需要尽可能地少。

    2.将一张100元的钞票换成1元.5元和10元的钞票,每种钞票至少一张,编写程序输出所有的换法,循环次数需要尽可能地少. public class Two_2money { public static ...

  3. max日期最大值为0_C语言编写程序输出10个整数中最小值或最大值

    C语言编写程序输出10个整数中最小值或最大值 这是一个比较基础,同时也包含C语言中诸多特点的程序,仔细体会有很多的格式规则和技巧.其中包括:输入语句,输出语句,数组,分支结构,循环结构.希望广大C语言 ...

  4. c语言一个整数各位数字个数_C语言编写程序输出10个整数中最小值或最大值

    C语言编写程序输出10个整数中最小值或最大值 这是一个比较基础,同时也包含C语言中诸多特点的程序,仔细体会有很多的格式规则和技巧.其中包括:输入语句,输出语句,数组,分支结构,循环结构.希望广大C语言 ...

  5. python编写程序、输出公元2000年到3000年所有闰年_编写程序,输出从公元2000年至3000年所有闰年的年号,每输出10个年号换一行.判断公元年是否为闰年的条件...

    题目: 编写程序,输出从公元2000年至3000年所有闰年的年号,每输出10个年号换一行.判断公元年是否为闰年的条件 解答: #include void Judge(int y) { while(1) ...

  6. Java面试题:在一个递增的数组里面,找出任意两个数的和等于100,编写程序输出这些数对,可以假设数组中不存在重复元素

    本文使用两种算法来实现,分别是二分查找法和插值查找法,发现插值查找法更好,更快地找到需要的数据. 代码如下: package com.moson.search;import java.util.Arr ...

  7. python输出由1234组成的三位素数_编写程序,输出所有由 1 、 2 、 3 、 4 这 4 个数字组成的素数,并且在每个素数中每个数字只使用依次。_学小易找答案...

    [判断题]在串行接口上,可以通过指定下一跳地址或出接口来配置静态路由. [单选题]某台路由器运行OSPF协议,并且没有指定Router ID,所有接口的P地址如下,则此路由器OSPF协议的 Route ...

  8. 用c语言编写程序输出* ***,用C语言如何编写程序输出以下图形

    用C语言如何编写程序输出以下图形 关注:169  答案:3  mip版 解决时间 2021-01-18 16:55 提问者傃顏莄蒾亾 2021-01-17 19:07 * * * * * * * * ...

  9. python输出斐波那契数列前20项、每输出5个数换行_按要求编写程序:输出斐波那契数列的前20项,每行输出5项....

    用循环语句编写一程序,要求输出下列图形 static void Main(string[] args)        {&nbsp 用C语言编写程序:键盘输入a和b两个整数,要求用函数求两个数 ...

最新文章

  1. Coggle加速计划:解决数据下载烦恼!
  2. 微服务:Java EE的拯救者还是掘墓人?
  3. 第k大的数 java_一道算法题:第K大的数
  4. LeetCode:155. 最小栈
  5. MVC3+Entity Framework 实现投票系统(一)
  6. ‘UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xff in position 0: invalid start byte‘成功解决
  7. 华为手机多久可以摆脱美国技术依赖?任正非放出豪言!
  8. ionic xcode 上传appstroe 创建Distribution证书报错 you already have a current iOS Distribution certificate
  9. SCU 4444: Travel(最短路)
  10. pulseaudio之pa_simple_new()流程(十八)
  11. mac python3.8上怎么安装pygame 第三方库_Python3.8安装Pygame教程步骤详解
  12. 如何加载和保存AutoCAD DXF文件(四参数法)
  13. Java 垃圾回收算法
  14. android nfc 启动流程,android-NFC-如何使用NDEF_DISCOVERED启动应用程序
  15. Calendar日期类使用总结
  16. 台式机安装纯ubuntu系统的操作步骤
  17. 拼多多校招----最大乘积(python)
  18. 百度APP“看听模式”:“AI主播”借道信息流全面落地?
  19. 刮刮奖效果的简单实现
  20. [实用理论] 互联网广告的产业链:广告主(advertiser),媒体(publisher),广告商(agency)

热门文章

  1. 【【重要通知】HCIE-Routing Switching切换HCIE-Datacom补充公告】
  2. 从0到一开发微信小程序(1)——申请账号并安装开发环境
  3. 【2017年第3期】“云治理”设想
  4. 泸州市的电子计算机学校名称,泸州市电子机械学校 学校图片简介
  5. python黑科技-五彩斑斓的黑
  6. 网络基础知识--IP地址
  7. java随机两个数组
  8. 2017-2018-1 团队名称 第一周 作业
  9. 阿里云域名持有者过户
  10. 日语二级语法汇总(part4/16)