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 - JavaScript

 愚直に数えてみたら時間がかかりすぎたり無限ループしたりとロクなことが無かったので,kozimaさんの(#3557)を丸写し。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
function doukaku73_bad(a, b, c){
  var f = function(x, y){ return x - y }, v = [a, b, c].sort(f), i = 0, d;
  for(; v[0] < v[1] && v[1] < v[2]; i++){
    v[0] += 2, v[1]--, v[2]--;
    if(v[0] > v[1]) v.sort(f);
  }
  return i + v[1];
}
/// ↓ ///

function doukaku73(a, b, c){
  for(var v = arguments, r = [], i = 3, j; i--;)
    r[i] = (v[i] - v[j = (i + 1) % 3]) % 3 ? Infinity : Math.max(v[i], v[j]);
  return Math.min.apply(null, r);
}

Index

Feed

Other

Link

Pathtraq

loading...