USACO-Chapter1-Section 1.4-Mother's Milk (milk3)

【题目描述】

      农民约翰有三个容量分别是A,B,C升的桶,A,B,C分别是三个从1到20的整数, 最初,A和B桶都是空的,而C桶是装满牛奶的。有时,农民把牛奶从一个桶倒到 另一个桶中,直到被灌桶装满或原桶空了。当然每一次灌注都是完全的。由于节约, 牛奶不会有丢失。写一个程序去帮助农民找出当A桶是空的时候,C桶中牛奶所剩量的所有可能性。

【输入格式】

单独的一行包括三个整数A,B和C。

【输出格式】

只有一行,升序地列出当A桶是空的时候,C桶牛奶所剩量的所有可能性。

【输入样例一】

8 9 10

【输出样例一】

1 2 8 9 10
【输入样例二】
2 5 10 
【输出样例二】 
5 6 7 8 9 10

【思路】

      用过程pull来实现倾倒的过程,因为牛奶重量一定,所以只需要两个参数即可,a,b,c分别代表三个桶。六种情况来模拟。以为输出要按照大小顺序,所以我们先用个二维数组来f[i,j]来表示a,c分别为i,j时候的状态,有则true。反之false。最后枚举桶排实现输出,完美解决。

【代码】
  • Executing...
  • Test 1: TEST OK [0.000 secs, 276 KB]
  • Test 2: TEST OK [0.000 secs, 276 KB]
  • Test 3: TEST OK [0.000 secs, 276 KB]
  • Test 4: TEST OK [0.000 secs, 276 KB]
  • Test 5: TEST OK [0.000 secs, 276 KB]
  • Test 6: TEST OK [0.000 secs, 276 KB]
  • Test 7: TEST OK [0.000 secs, 276 KB]
  • Test 8: TEST OK [0.000 secs, 276 KB]
  • Test 9: TEST OK [0.000 secs, 276 KB]
  • Test 10: TEST OK [0.000 secs, 276 KB]
  • All tests OK.
{
 ID  : c_CaM.19
 LANG: PASCAL
 TASK: milk3
}
Program CaM(input,output);
Var
  f:array[0..20,0..20] of boolean;
  aa,bb,cc,k,i,j:longint;

Function min(x,y:longint):longint;
Begin
  if x<y then exit(x) else exit(y);
End;

Procedure innt;
Begin
  assign(input,'milk3.in'); reset(input);
  assign(output,'milk3.out'); rewrite(output);
End;

Procedure outt;
Begin
  close(input);
  close(output);
End;

Procedure pull(a,c:longint);
Var
  b:longint;
Begin
  if f[a,c] then exit;
  f[a,c]:=true; b:=cc-a-c;
  pull(a-min(a,bb-b),c);
  pull(a-min(a,cc-c),c+min(a,cc-c));
  pull(a+min(b,aa-a),c);
  pull(a,c+min(b,cc-c));
  pull(a+min(c,aa-a),c-min(c,aa-a));
  pull(a,c-min(c,bb-b));
End;

Begin
  innt;
  readln(aa,bb,cc);
  pull(0,cc);
  for i:=0 to cc do
    if f[0,i]=true then
    Begin
      write(i);
      break;
    End;
  for j:=i+1 to cc do
    if f[0,j]=true then write(' ',j);
  writeln;
  outt;
End.
posted @ 2012-03-05 23:41  你滴韩王  阅读(337)  评论(0)    收藏  举报