challenge 水の移し替えパズル

A, B, Cの容器があり,それぞれ水が4L, 2L, 10L入っている. ここで次の操作を繰り返す.

(*)「A, B, Cのどれか二つの容器から水を1Lずつくみ上げ,残りの容器に移す.」

たとえばA, Bから1Lずつくみ上げて移せばA=3L, B=1L, C=12Lとなる. くみ上げる前の容器には必ず水が入っているとする.

(*)を繰り返してどれか一つの容器にのみ水がはいっている状態にする最小手数を求めよ.

可能ならA=827392L,B=65536L,C=122880Lのときも求めよ.


このお題は光成さんの投稿を元に作成しました。ご協力ありがとうございます。

Posted feedbacks - awk

A<=B<=Cとしたとき、

・AとBから、Aが空になるまで汲み続け、
・BとCからAに汲み、AとBからCに汲む、を繰り返す

と、できると思ったんですが、最短なのかどうかよくわかりません。
正解はどこかにあります?
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
{
    # A, B, C を cups[0], cups[1], cups[2] とする
    cups[0] = $1
    cups[1] = $2
    cups[2] = $3

    # A <= B <= C にそろえる
    sort(cups)

    total = 0
    # A と B からとり、C に移す。A が空になるまで
    count = cups[0]
    cups[0] = 0
    cups[1] -= count
    cups[2] += count * 2
    total += count

    # B が空になるまで、以下を繰り返す。
    # B と C から取って A に移し、A と B からとって C に移す。
    count = cups[1]
    cups[0] = count % 2
    cups[1] -= count
    cups[2] += count * 2
    total += count

    if(cups[0] != 0) {
        print "N/A"
    } else {
        print "Total :", total
    }
}


# 3要素に限定したソート
function sort(cups) {
    if(cups[0] > cups[1]) {
        swap(cups, 0, 1)
    }
    if(cups[0] > cups[2]) {
        swap(cups, 0, 2)
    }
    if(cups[1] > cups[2]) {
        swap(cups, 1, 2)
    }
}

function swap(a, i, j,   tmp) {
    tmp = a[i]
    a[i] = a[j]
    a[j] = tmp
}

Index

Feed

Other

Link

Pathtraq

loading...