前回のエントリの問題を教えられたサイトに、さらに次のような問題がありました。
1から7の数字を書いたカードが2枚ずつ計14枚ある。そしてこれを1列に並べ,2枚の1の間にはカードが1枚,2枚の2の間にはカードが2枚はさまれていて,同様に,3の間には3枚,4の間には4枚,5の間には5枚,6の間には6枚,7の間には7枚のカードがはさまれるように14枚のカードを並べて下さい。
http://www.ic-net.or.jp/home/takaken/pz/index2.html
これ、単純な問題なのだけれど、どうしてもわかりませんでした。で、答えを見てみたのですが、ちょっと感動しましたね。再帰を使ってこんなにシンプルに解けるのですか。元の回答は C言語で書かれていますが、Ruby に移植してみました。これは Ruby としてはめずらしく、C言語の方が単純ですね。
table = Array.new(14, 0) card = lambda do |n| if n > 7 p table exit else i, j = 0, n + 1 while j < 14 if table[i].zero? and table[j].zero? table[i] = table[j] = n card.call(n + 1) table[i] = table[j] = 0 end i += 1 j += 1 end end end card.call(1)
教えられてみれば、じつによくできた解法ですね。
正解(のひとつ)はこれです。
[1, 7, 1, 2, 5, 6, 2, 3, 4, 7, 5, 3, 6, 4]
ちなみに異なる解は全部で 52 個あります。