【BFS练习】倒水问题程序源代码(pascal)

题目:

有三个分别容量分别为a升、b升和c升的杯子(c>b>a>0,且b与a互质)


初始时:c杯装满水有10升,a与b均为空,容量分别为:3升、7升。


规则:
1、三个杯子相互倒水且不准把水倒往三个杯子之外,


2、每次倒水必须是把目标杯装满或是倒出水的杯子已空才能停止。


要求:给出各杯子的容量,请用最少的倒水次数,使C杯中剩余d升水。

程序:

var
        man:array[1..3] of longint=(3,7,10);
        data:array[1..400,1..4] of longint;
        bz:array[0..3,0..7,0..10] of boolean;
        i,j,d,p,q:longint;
begin
        readln(d);
        bz[0,0,10]:=true;
        data[1,1]:=0;
        data[1,2]:=0;
        data[1,3]:=10;
        i:=0;
        j:=1;
        repeat
                inc(i);
                for p:=1 to 3 do
                        for q:=1 to 3 do
                                if (p<>q)and(data[i,p]>0)and(data[i,q]<man[q]) then
                                begin
                                        inc(j);
                                        data[j]:=data[i];
                                        data[j,4]:=data[i,4]+1;
                                        if man[q]>=data[j,p]+data[j,q] then
                                        begin
                                                data[j,q]:=data[j,q]+data[j,p];
                                                data[j,p]:=0;
                                        end
                                        else
                                        if data[j,p]>=man[q]-data[j,q] then
                                        begin
                                                data[j,p]:=data[j,p]-(man[q]-data[j,q]);
                                                data[j,q]:=man[q];
                                        end;
                                        if bz[data[j,1],data[j,2],data[j,3]] then dec(j)
                                        else
                                        begin
                                                bz[data[j,1],data[j,2],data[j,3]]:=true;
                                                if data[j,3]=d then
                                                begin
                                                        writeln(data[j,4]);
                                                        halt;
                                                end;
                                        end;
                                end;
        until i>=j;
end.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值