經典「死神來了 3」同款倒水謎題推廣。給定兩壺容量 Ca, Cb 及目標量 N (目標態為 B 壺含 N 加侖),輸出任一合法操作序列。允許操作:fill A/B, empty A/B, pour A B / B A, success。
本質上求解 Ca * x + Cb * y = N 的整數解。但題目不要求最優步數,只需任一可行序列。採用固定策略:始終對 A 壺灌滿,倒入 B 壺;B 滿則倒空;循環直到 B 達到 N。
sA = 0, sB = 0sA == 0:fill A, sA = Capour A B
sB += sAsB >= Cb:
Cb != N:empty B, sA = sB - Cb, sB = 0sB = Cb (保持滿狀態)sA = 0sB == N:是 → success,結束
#include
int main() {
int Ca, Cb, N, sA, sB;
while (scanf("%d %d %d", &Ca, &Cb, &N) == 3) {
sA = sB = 0;
while (1) {
if (sA == 0) {
printf("fill A\n");
sA = Ca;
} else {
printf("pour A B\n");
sB += sA;
if (sB >= Cb) {
if (Cb != N) {
printf("empty B\n");
sA = sB - Cb;
sB = 0;
} else {
sB = Cb;
}
} else {
sA = 0;
}
}
if (sB == N) {
printf("success\n");
break;
}
}
}
return 0;
}
sA + sB (模 Cb) 遍歷 Ca 的倍數模 Cb 的剩餘類gcd(Ca, Cb) | N,上述過程必能達到 sB = NO(Cb / gcd(Ca, Cb)) 步,極小O(1)(sA, sB) 共 (Ca+1)*(Cb+1) 個
輸入: 3 5 4
輸出:
fill A
pour A B
fill A
pour A B
empty B
pour A B
fill A
pour A B
success
對應經典 3/5 加侖得 4 加侖解法。