关闭

分油问题

标签: 编程
259人阅读 评论(0) 收藏 举报

【题目描述】
设有大小不等的3个无刻度的油桶,分别能够存满,X,Y,Z公升油。初始时,第一个油桶盛满油,第二、三个油桶为空。编程寻找一种最少步骤的分油方式,在某一个油桶上分出targ升油。若找到解,则将分油方法打印出来,否则输出“No Answer!”。
【输入格式】
一行4个整数,依次表示X,Y,Z,targ,每个数之间用一个空格隔开
【输出格式】
表示解的情况,如果无解输出“No Answer!”,如果有解,则输出分油方法(每一步三个油桶的状态),如果解不唯一也只有输出任一个解
【样例输入】
80 50 30 40
【样例输出】
80 0 0
30 50 0
30 20 30
60 20 0
60 0 20
10 50 20
10 40 30
【分析】
广搜,每次搜索6种倒油方案:
A–>B
A–>C
B–>A
B–>C
C–>A
C–>B

var
  q:array[0..10001,1..4]of longint;
    tar:array[1..3]of longint;
    targ,head,tail,flag:longint;

procedure move(a,b,c:longint);
var
  i:longint;
begin
  inc(tail);
    if q[head,a]+q[head,b]>tar[b] then begin
      q[tail,a]:=q[head,a]+q[head,b]-tar[b];
        q[tail,b]:=tar[b];
    end
    else begin
      q[tail,a]:=0;
        q[tail,b]:=q[head,a]+q[head,b];
    end;
    q[tail,c]:=q[head,c];
    q[tail,4]:=head;
    for i:=1 to tail-1 do
      if (q[tail,1]=q[i,1])and(q[tail,2]=q[i,2]) then begin dec(tail);exit; end;
    if (q[tail,a]=targ)or(q[tail,b]=targ) then flag:=1;
end;

procedure print(step:longint);
begin
  if q[step,4]<>0 then print(q[step,4]);
  writeln(q[step,1],' ',q[step,2],' ',q[step,3]);
end;

begin
  read(tar[1],tar[2],tar[3],targ);
    q[1,1]:=tar[1]; q[1,2]:=0; q[1,3]:=0; q[1,4]:=0;
    flag:=0;
    head:=1;tail:=1;
    while (head<=tail)and(flag=0) do begin
        if (q[head,1]>0)and(flag=0) then move(1,2,3);
        if (q[head,1]>0)and(flag=0) then move(1,3,2);
        if (q[head,2]>0)and(flag=0) then move(2,1,3);
        if (q[head,2]>0)and(flag=0) then move(2,3,1);
        if (q[head,3]>0)and(flag=0) then move(3,1,2);
        if (q[head,3]>0)and(flag=0) then move(3,2,1);
        inc(head);
    end;
    if head>tail then begin write('No Answer!');exit; end;
    print(tail);
end.
3
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

三个油瓶分油问题

1.问题描述    原问题:两个小孩去打油,一个人带了一个一斤的空瓶,另一个带了一个七两一个三两的空瓶。原计划各打一斤油,可是由于所带的钱不够,只好两人合打了一斤油,可是又没有其它工具,试仅用三个瓶子(一斤、七两、三两)精确地分成两个半斤油来。 2.算法设计  ...
  • u011070171
  • u011070171
  • 2015-10-20 21:16
  • 2188

油瓶分油问题

油瓶分油问题举例描述:           例如:有三个大小不一样的且没有刻度的油瓶,其容量分别为12升、8升、5升;三个油瓶的初始油量为:12升、0升、0升;可以随意用某一瓶的油去灌满一瓶油,也可以把某一瓶...
  • u011390632
  • u011390632
  • 2014-12-03 15:09
  • 1081

2017-03-04 分油问题

Description设有大小不等的3个无刻度的油桶,分别能盛满 X、Y、Z(都小于等于 100)升油,初始时第一个油桶盛满,另外两个为空。现在,要想在某一瓶中分出 T升油。分油时可把一个桶里的油倒入另外的桶中,或者将桶中的油倒空。设计一种以最少步骤的分油方案。Input第一行:X Y Z {设第一...
  • tro_Oops
  • tro_Oops
  • 2017-03-04 15:06
  • 230

【蓝桥杯】泊松分酒

BFS的简单的入门题目,可以学着敲一敲,建立BFS的思想。 当然,如果能更好的使用STL,可以在一定程度上简约代码,增强可读性。
  • mullerwch
  • mullerwch
  • 2014-03-11 18:05
  • 1316

经典趣味数学题—分油问题的一般性求解

分油问题是一道非常经典的初等数学趣味题。它有很多种表述版本。例如, 版本1:日本分油问题。有一个装满油的8公升容器,另有一个5公升及3公升的空容器各 一个,且三个容器都没有刻度,试将此8公升油分成4公升。. 版本2:法国著名数学家泊松年轻时研究过的一道题: 某人有12品脱美酒,想把一半赠人,但...
  • tanqiwen3
  • tanqiwen3
  • 2013-04-19 22:17
  • 1410

简述P问题,NP问题,NPC问题以及NP Hard问题

发现我们经常谈到NP问题,NP完全问题,NP难问题,但是其实他们之间是有区别的。 1、P问题是指:一个问题可以找到一个能在多项式的时间里解决它的算法。也就是复杂度为O(1),O(log(n)),O(n^a)等的。 2、NP问题是指可以在多项式的时间里验证一个解的问题(注意,NP问题不是非P问题!!...
  • John159151
  • John159151
  • 2015-10-11 21:52
  • 1756

回溯算法--装载问题

回溯法 1、有许多问题,当需要找出它的解集或者要求回答什么解是满足某些约束条件的最佳解时,往往要使用回溯法。 2、回溯法的基本做法是搜索,或是一种组织得井井有条的,能避免不必要搜索的穷举式搜索法。这种方法适用于解一些组合数相当大的问题。 3、回溯法在问题的解空间树中,按深度优先策略,从根结点出...
  • sinat_24436879
  • sinat_24436879
  • 2015-04-10 22:05
  • 2691

背包问题,硬币问题

至少有4种背包问题:1)01背包,
  • binling
  • binling
  • 2014-10-02 14:36
  • 564

什么是P问题、NP问题和NPC问题

这或许是众多OIer最大的误区之一。     你会经常看到网上出现“这怎么做,这不是NP问题吗”、“这个只有搜了,这已经被证明是NP问题了”之类的话。你要知道,大多数人此时所说的NP问题其实都是指的NPC问题。他们没有搞清楚NP问题和NPC问题的概念。NP问题...
  • sinat_25357975
  • sinat_25357975
  • 2016-04-16 12:00
  • 598

例题:装箱问题

问题描述 一个工厂制造的产品形状都是长方体,它们的高度都是h,长和宽都相等,一共有6个型号,它们的长度和宽度分别是1X1,2X2,3X3,4X4,5X5,6X6。这些产品通常使用一个6X6Xh的长方体包裹包装,然后邮寄给客户。因为邮费很贵,所以工厂要想方设法地减少每个订单运送时的包裹数量。他们需要...
  • Coder__CS
  • Coder__CS
  • 2016-06-16 11:21
  • 1331
    个人资料
    • 访问:228738次
    • 积分:3671
    • 等级:
    • 排名:第10309名
    • 原创:176篇
    • 转载:22篇
    • 译文:0篇
    • 评论:18条
    个人主页
    www.jrxblog.top 欢迎访问&交换友链!
    博客专栏