NISHIO Hirokazu's website > NISHIO HIROKAZU # Archived COREBlog
これは2004年11月4日から2006年2月18日までZopeで運用していたCOREBlogの静的なアーカイブです。 新しい日記は「西尾泰和の日記」で運用しています。

薬品格納クイズ(解答)

薬品格納クイズ(問題編)

「プログラマの数学」はまだ読んでないんですけど、この問題は「縦2マスの薬品箱(以下「棚」)」が6つ並んでいる」というくりかえし構造を見抜くところ がキーになっているのでしょう。全体を一度に考えようとするとわけがわからなくなりますが、棚ごとに考えれば一度に考えるのは4マスで済みますから。

というわけでまず一つ目の棚に薬品を入れてみます。 薬品を配置できるパターンはAA、AB、BAの3通りですね。

次に、1つ目の棚の隣に2つ目の棚を設置して、その中に薬品を入れます。このとき、手前の棚がAAならば薬品Bの発火を気にせずにAA、 AB、BAの3通り並べられますが、ABの時はBAとAA、BAの場合はABとAAの2通りしか並べられません。ややこしい。全部足すと7通り。整理する と、AAが3通り、ABが2通り、BAが2通り。 (ここで対称性を考えるとABとBAをまとめてしまえるんですけれども、それは問題を解く上で本質的じゃないテクニックなので保留)

次に3つ目の棚を置いて考えます。薬品Bが隣り合うことだけが問題なので、棚1の中がどういう配置だったかはもう気にしなくていんだな… と気づきます。考えるのは棚2の中身だけ。棚2がAAになっていればAA、AB、BAの3通り、ABの時はBAとAAの2通り、BAの場合はABとAAの 2通り。これは棚2の中身を並べたときに考えたことと似てますね。 棚2の中身がAAであるような(棚2までの)並べ方は3通りでした。これを略してAA2と表記することにしましょう。そうすると棚3の中身がAAであるよ うな並べ方(AA3)は、棚2がAAかABかBAの時に隣にAAと並べた並べ方で全てなので

AA3 = AA2 + AB2 + BA2
となります。同様に、棚3の中身がABであるような並べ方は棚2がAAかBAの時に隣にABと並べた並べ方で全てなので…と考えていくと
AB3 = AA2 + BA2
BA3 = AA2 + AB2
となります。今は棚2と棚3でやりましたが、今回の問題では一般的に棚kと棚k+1についてこの関係が成り立ちます。 もうここまでくれば、棚6つくらいなら手計算でも簡単に答えが求まりますね。AA1 = 1, AB1 = BA1 = 1なので、AA2 = 3, AB2 = BA2 = 2で、 AA3 = 7, AB3 = BA3 = 5…と。

ちなみに最後の棚がABかBAかによって配置の個数に差が出るはずがない(対称だから)ということに気がついていればABk = BAkなので式はもっと簡単になって

A(k+1) = A(k) + B(k)
B(k+1) = 2*A(k) + B(k)
となりますね。僕がやったのはこのタイプで、Pythonを使って
>>> def f((a, b)):
	return (a+b, 2*a+b)

>>> (1, 2)
(1, 2)
>>> f(_)
(3, 4)
>>> f(_)
(7, 10)
>>> f(_)
(17, 24)
>>> f(_)
(41, 58)
>>> f(_)
(99, 140)

こんな感じで、答えは99+140=239、となります。(あってるかな?)

棚の個数が6じゃなくて、一般にkの場合はどうなるか、という話も書こうかと思ったけれども、それはまたの機会に…。


[雑記]  @2005-05-01 20:20
<< Pythonでフラクタル(ジュリア集合) | Main | 日記 >>

Comments このページは静的なアーカイブなので新しいコメントは受け付けておりません。ご意見ご感想はお気軽にメールでどうぞ。coreblog「あっとまーく」nishiohirokazu.org。
Trackbacks

PageView: 1427 Score: 215.87099 このカウンタは2006-03-26 11:05で停止しています。
Powered by COREBlog

NISHIO Hirokazu's website > NISHIO HIROKAZU # Archived COREBlog
Contact me: coreblog"at mark"nishiohirokazu.org
Access counter: This Page:712795 Total:1827506 during 2004/01/23-2006/03/26