问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

高分:分油问题,c++怎么编程?

发布网友 发布时间:2022-04-30 18:31

我来回答

3个回答

热心网友 时间:2022-06-29 06:03

#include <stdio.h>
#include <string.h>
int vol1,vol2,vol3,cur1,cur2,cur3,flag=0,goal,curb1,curb2,curb3;
int map[100][100][100];
int x[10000]; //记录每一步的倒油操作,1到2表示为1,1到3表示为2,2到1表示为3,2到3表示为4,3到1表示为5,3到2表示为6 
void push(int *t1, int *t2,int v2) //把 *t1和*t2为当前油量,v2为*t2所在容器的容量。 
{if(  v2>*t1+*t2){*t2=*t2+*t1;*t1=0;}
 else {  *t2=*t2+*t1;*t1=*t2-v2;*t2=v2;}
}
void print(int step)
{printf("%d %d %d\n",curb1,curb2,curb3);
  for(int i=1;  i<step;i++)
  switch(x[i])
   { case 1: 
              push(&curb1,&curb2,vol2);
            printf("%d %d %d\n",curb1,curb2,curb3);
            break;
     case 2: 
            push(&curb1,&curb3,vol3);
            printf("%d %d %d\n",curb1,curb2,curb3);
            break;
     case 3: 
            push(&curb2,&curb1,vol1);
            printf("%d %d %d\n",curb1,curb2,curb3);
            break;
     case 4: 
            push(&curb2,&curb3,vol3);
            printf("%d %d %d\n",curb1,curb2,curb3);
            break;
     case 5: 
            push(&curb3,&curb1,vol1);
            printf("%d %d %d\n",curb1,curb2,curb3);
            break;
     case 6: 
            push(&curb3,&curb2,vol2);
            printf("%d %d %d\n",curb1,curb2,curb3);
            break;
     
   }
     
}
void backtrack(int step)
{ int t1=cur1,t2=cur2,t3=cur3;  
   if(flag) return;
   if(  t1==goal||t2==goal||t3==goal)
    { print(step);flag=1;return; }
  //开始尝试1倒到2 
    push(&cur1,&cur2,vol2);
    if(!map[cur1][cur2][cur3])
    {x[step]=1;map[cur1][cur2][cur3]=1;
     backtrack(step+1); 
    }
    cur1=t1;cur2=t2;cur3=t3;
   //结束1倒到2,恢复各容器的原来油量 
  //开始尝试1倒到3 
      push(&cur1,&cur3,vol3);
    if(!map[cur1][cur2][cur3])
    {  x[step]=2;map[cur1][cur2][cur3]=1;
         backtrack(step+1); 
    }
    cur1=t1;cur2=t2;cur3=t3;
  //结束1倒到3,恢复各容器的原来油量 
  //开始尝试2倒到1 
    push(&cur2,&cur1,vol1);
    if(!map[cur1][cur2][cur3])
    {x[step]=3;map[cur1][cur2][cur3]=1;
     backtrack(step+1); 
    }
    cur1=t1;cur2=t2;cur3=t3;
  //结束2倒到1,恢复各容器的原来油量
  //开始尝试2倒到3
    push(&cur2,&cur3,vol3);
    if(!map[cur1][cur2][cur3])
    {x[step]=4;map[cur1][cur2][cur3]=1;
     backtrack(step+1); 
    }
    cur1=t1;cur2=t2;cur3=t3;
  //结束2倒到3,恢复各容器的原来油量
  //开始尝试3倒到1 
    push(&cur3,&cur1,vol1);
    if(!map[cur1][cur2][cur3])
    {x[step]=5;map[cur1][cur2][cur3]=1;
     backtrack(step+1); 
    }
    cur1=t1;cur2=t2;cur3=t3;
  //结束3倒到1,恢复各容器的原来油量
  //开始尝试3倒到2 
    push(&cur3,&cur2,vol2);
    if(!map[cur1][cur2][cur3])
    {x[step]=6;map[cur1][cur2][cur3]=1;
     backtrack(step+1); 
    }
    cur1=t1;cur2=t2;cur3=t3;
  //结束3倒到2,恢复各容器的原来油量
}
  
int main()
{scanf("%d%d%d%d%d%d%d",&vol1,&vol2,&vol3,&cur1,&cur2,&cur3,&goal);
 memset(map,0,sizeof(map));
 map[cur1][cur2][cur3]=1;
   curb1=cur1;curb2=cur2;curb3=cur3;
 backtrack(1);
 if(  !flag)
 printf("impossible");
}


输入:


3行
第1行是3个整数,由大到小,表示3个容器的容量
第1行是3个整数,表示3个容器的原有油量
第3行是1个整数,表示要求得到的油量(放在哪个容器里得到都可以)


输出:


实现过程中的各个状态(即各个容器的油量)。答案不唯一。
如果没有可能实现,则输出:“impossible”。

热心网友 时间:2022-06-29 06:03

今天实验了一下,写出了一半吧。就是这个求最优解就太困难了,而且记录求解路径很困难。这种题遇到不是一次两次了,有喜欢的大家一起交流交流经验。

热心网友 时间:2022-06-29 06:04

能强行写出,不过程序优化就等等吧
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
汽车胎扎了个钉子是拔还是不拔? 台式机电源什么牌子好 台式机电源有哪些牌子 金牌 银牌 铜牌电源哪个好 台式机电源等级性能解析 电脑电源推荐-全汉(FSP) 500W银牌(88%)全模组SFX电源 我的妻子背叛了我,我该怎么办, 初一语文复习材料(急急急!!!) 绿色蝈蝈课后题答案七上语文 女人梦见黄鼠狼的七大预兆 怎么知道注塑机螺杆有无卡死现象? 请问为什么在钢之炼金术师fa里,爱德华一开始不用炼金术换 怎样设置不接群消息 用友T3用友通标准版在建立新年度帐的时候提示“列名curgroupcol无效”,具体情况下付 LED显示屏的长排线怎么算的? 用友T3建立新账时出现“列名curgroupcol无效”,麻烦啊 当人们对通货膨胀的预期较高时,往往会增加消费,减少储蓄,抢购和持币待购成为普遍现象 新苹果手机怎么激活 用友T3通用版在建年度新账时出现“列名curgroupcol无效”请问我该怎么解决,请详细指教? 高一政治 持币待购什么意思 用友T3建立新账时出现“列名curgroupcol无效”要怎么弄啊 笔记本换屏幕和排线问题? 我的笔记本屏幕坏了 买了个屏幕是30针的可是我的排线是40针的请问一下我自己买一根30针的排线可 显示屏高3.14米排线要多少根? 联想笔记本的屏幕排线通用吗?y410p 是什么规格的排线呢?淘宝直接搜索搜不到 笔记本窄边框屏排线是30针的60hz 想换40针的144的有办法吗 RedmiG游戏本屏幕排线是多少?30还是40? 无线遥控开关配对方法教程为什么无线遥控开关配对后只能关不能开? 无线遥控开关如何对码? KGS一A10B无线遥控器,怎么对码? 含近义词的词语有哪些 2个字的 含近义词的词语? ,男人说在翁翁是什么意思啊? 微信群消息怎么屏蔽 如何不接群消息 请求高手优化sql查询速度!!!!! 不分组查询很快,分组后超慢,求解决方法 CAD打开的时候十字光标是斜的怎么处理,我是天正转T3后光标变斜的,在天正里是正的 斯维尔三维算量打开后,中间有一个光标,删不掉。怎么办 如图右下角。 用js写个导航栏的红色线条,第一个显示,滑动到第二个显示,第一个消 买车返利是什么意思? 脑瓜子嗡嗡的,老响,这是什么病? 求一SQL语句 例如表数据为: A 3 B 2 C 4 理想输出为: A A A B B C C C C 市场上出现“物以稀为贵”现象的原因可能是 A.商品过剩 B.持币待购 C.供不应求 D.供过于 相亲对象给你发我脑瓜子嗡嗡的,明天给你赔罪好不好女生应该怎么回答他? 市场容量是什么意思 关于SQL数据汇总求助 mysql存储过程中光标所指向的记录在打开光标之前可以改变吗 市场规模与产业规模分别是什么意思? 还是Matlab程序问题 VB32与VB64的区别 sql查询横排 用友T3 10.8PLUS1升级老版本数据库时提示 -2147217900 列名 iTaxUnitPrice 无效 烙筋饼用高筋面粉还是低筋面粉