设有大小不等的X,Y,Z三个无刻度的油桶,分别能够盛满油X,Y,Z(例如,X=80,Y=50,Z=30),并约定X>Y>Z。初始时,仅X油桶盛满油,Y和Z油桶为空。要求程序寻找一种最少的分油步聚,在某个油桶中分出T升油(例如T=40)
CLS
COLOR 10
N = 100
BU = 3
DIM ST(N, BU), SB(N), OB(N), LAST(N), FU(BU)
T:
INPUT FU(0), FU(1), FU(2), TA
FOR I = 0 TO 1: FOR J = I + 1 TO 2
IF FU(I) < FU(J) THEN SWAP FU(I), FU(J)
IF FU(I) = FU(J) THEN GOTO T
NEXT J, I
IF TA > FU(0) THEN GOTO T
IF TA = FU(0) THEN PRINT "IN BIGGET": END
HD = 0: TL = 0
FD = 0: UN = 0
ST(0, 0) = FU(0)
FOR I = 1 TO BU - 1
ST(0, I) = 0
NEXT I
DO
FOR I = 0 TO BU - 1
IF UN OR FD THEN EXIT FOR
IF ST(HD, I) > 0 THEN
FOR J = 0 TO BU - 1
IF UN OR FD THEN GOTO X
IF I <> J AND ST(HD, J) < FU(J) THEN
IF ST(HD, I) > FU(J) - ST(HD, J) THEN
V = FU(J) - ST(HD, J)
ELSE
V = ST(HD, I)
END IF
WI = ST(HD, I) - V
WJ = ST(HD, J) + V
FOR K = 0 TO TL
IF ST(K, I) = WI AND ST(K, J) = WJ THEN GOTO XX
NEXT K
XX:
IF K > TL THEN
TL = TL + 1
ST(TL, I) = WI
ST(TL, J) = WJ
ST(TL, 3 - I - J) = ST(HD, 3 - I - J)
SB(TL) = I + 1
OB(TL) = J + 1
LAST(TL) = HD
IF WI = TA OR WI = TA THEN FD = 1
END IF
END IF
NEXT J
X:
END IF
NEXT I
IF FD = 0 THEN
HD = HD + 1
IF HD > TL THEN UN = 1
END IF
LOOP WHILE FD = 0 AND UN = 0
IF FD THEN
I = TL
J = -1
DO
K = LAST(I)
LAST(I) = J
J = I
I = K
LOOP WHILE J
DO
K = LAST(K)
IF K >= 0 THEN
PRINT USING "#####"; SB(K);
PRINT " to";
PRINT USING "##"; OB(K);
PRINT ":";
PRINT ST(K, 0); ST(K, 1); ST(K, 2);
END IF
LOOP WHILE K >= 0
ELSE
PRINT "Unable!"
END IF
END
注:本人喜欢COLOR 10