uva10603 Pascal代码(首发)

  1 var a,b,c,d,h,t,p,q,qq,o,s1,s2,s3,abc:longint;
  2     f:array[0..200,0..200]of longint;
  3     f1,f2,f3:array[1..50000]of longint;
  4 function min(a,b:longint):longint;begin if a<b then exit(a) else exit(b);end;
  5 procedure asdf(x,y:longint);
  6 begin
  7   if(x=12)then  //调试时加的,不要管它
  8   begin
  9     write;
 10   end;
 11   if(x>=q)and(x<=d)then
 12   begin
 13     if(y<qq)or(x>q)then
 14     begin
 15       qq:=y;
 16       q:=x;
 17     end;
 18   end;
 19 end;
 20 begin
 21 readln(abc);
 22 for abc:=1 to abc do
 23 begin
 24   readln(a,b,c,d);
 25   fillchar(f,sizeof(f),$7f);
 26   f[0,0]:=0;
 27   h:=0;t:=1;
 28   f1[1]:=0;f2[1]:=0;f3[1]:=c;
 29   q:=0;qq:=0;
 30   if d>c then
 31     q:=c;
 32   if d=c then
 33     writeln(0,' ',c)
 34   else
 35   begin
 36   repeat
 37     h:=h mod 50000+1;
 38     s1:=f1[h];s2:=f2[h];s3:=f3[h];
 39     p:=min(s1,b-s2);
 40     if(p>0)and(f[s1-p,s2+p]>f[s1,s2]+p)then
 41     begin
 42       t:=t mod 50000+1;
 43       f1[t]:=s1-p;f2[t]:=s2+p;f3[t]:=s3;
 44       f[s1-p,s2+p]:=f[s1,s2]+p;
 45       o:=f[s1-p,s2+p];
 46       asdf(s1-p,o);
 47       asdf(s2+p,o);
 48     end;
 49     p:=min(a-s1,s2);
 50     if(p>0)and(f[s1+p,s2-p]>f[s1,s2]+p)then
 51     begin
 52       t:=t mod 50000+1;
 53       f1[t]:=s1+p;f2[t]:=s2-p;f3[t]:=s3;
 54       f[s1+p,s2-p]:=f[s1,s2]+p;
 55       o:=f[s1+p,s2-p];
 56       asdf(s2-p,o);
 57       asdf(s1+p,o);
 58     end;
 59     p:=min(s1,c-s3);
 60     if(p>0)and(f[s1-p,s2]>f[s1,s2]+p)then
 61     begin
 62       t:=t mod 50000+1;
 63       f1[t]:=s1-p;f2[t]:=s2;f3[t]:=s3+p;
 64       f[s1-p,s2]:=f[s1,s2]+p;
 65       o:=f[s1-p,s2];
 66       asdf(s1-p,o);
 67       asdf(s3+p,o);
 68     end;
 69     p:=min(a-s1,s3);
 70     if(p>0)and(f[s1+p,s2]>f[s1,s2]+p)then
 71     begin
 72       t:=t mod 50000+1;
 73       f1[t]:=s1+p;f2[t]:=s2;f3[t]:=s3-p;
 74       f[s1+p,s2]:=f[s1,s2]+p;
 75       o:=f[s1+p,s2];
 76       asdf(s1+p,o);
 77       asdf(s3-p,o);
 78     end;
 79     p:=min(s2,c-s3);
 80     if(p>0)and(f[s1,s2-p]>f[s1,s2]+p)then
 81     begin
 82       t:=t mod 50000+1;
 83       f1[t]:=s1;f2[t]:=s2-p;f3[t]:=s3+p;
 84       f[s1,s2-p]:=f[s1,s2]+p;
 85       o:=f[s1,s2-p];
 86       asdf(s2-p,o);
 87       asdf(s3+p,o);
 88     end;
 89     p:=min(b-s2,s3);
 90     if(p>0)and(f[s1,s2+p]>f[s1,s2]+p)then
 91     begin
 92       t:=t mod 50000+1;
 93       f1[t]:=s1;f2[t]:=s2+p;f3[t]:=s3-p;
 94       f[s1,s2+p]:=f[s1,s2]+p;
 95       o:=f[s1,s2+p];
 96       asdf(s2+p,o);
 97       asdf(s3-p,o);
 98     end;
 99   until h=t;
100   writeln(qq,' ',q);
101   end;
102 end;
103 end.

网上都简单地说了一句:DFS就好了,个人觉得太随便了,但自己想写时也只能说出这是DFS,

主要注意点:

1.存储二维即可(非要三维随你便)

2.时间几乎不用管,倒是剪枝很容易剪错

3.最佳更新状态时要注意: //  ↓取自源码

  if(x>=q)and(x<=d)then
  begin
    if(y<qq)or(x>q)then
    begin
      qq:=y;
      q:=x;
    end;
  end;

要求:水量在当前最佳与d之间

分类讨论

①当前=最佳    倒水量<最佳到水量 ->替换

②当前>最佳    直接替换

 

这个分类一定要分好,否则像我一样连错45遍

posted @ 2015-07-08 12:58  汪立超  阅读(150)  评论(0)    收藏  举报