home contents changes options help

3色の玉がn個ずつ同じ個数だけある。この3n個の玉を一列に並べるとき、 隣り合う色が互いに異なる色の並べ方の総数を計算せよ。


うーむ。なかなか難しい問題ですね。 「こんなのを考えたからってなんになるんでしょうか!」 という声が聞こえてきそうです。(笑)

私もそう思います! しかしながら、計算できてしまったので計算しておきましょう。 500年後くらいには、なにかの役に立つかもしれません。

プログラムは以下の通りです。

nStagger :: Int -> Int -> Int -> Int -> Int
nStagger l m n k
 | (l == 0) && (m == 0) && (n == 0) = 1
 | (l < 0) || ( m < 0 ) || ( n < 0 ) = 0
 | k == 0 = (nStagger (l-1) m n 1) + (nStagger l (m-1) n 2)
        + (nStagger l m (n-1) 3)
 | k == 1 = (nStagger l (m-1) n 2) + (nStagger l m (n-1) 3)
 | k == 2 = (nStagger (l-1) m n 1) + (nStagger l m (n-1) 3)
 | k == 3 = (nStagger (l-1) m n 1) + (nStagger l (m-1) n 2)

短いプログラムですが、再帰的にしらみつぶしに調べています。 うまくいかなかったら、0としてカウントしています。

計算結果は以下の通りです。

*Main> nStagger 1 1 1 0
6
*Main> nStagger 2 2 2 0
30
*Main> nStagger 3 3 3 0
174
*Main> nStagger 4 4 4 0
1092
*Main> nStagger 5 5 5 0
7188
*Main> nStagger 6 6 6 0
48852
*Main> nStagger 7 7 7 0
339720
*Main> nStagger 8 8 8 0
2403588
*Main> nStagger 9 9 9 0
17236524

三色がそれぞれ1個しかない場合は、明らかで、3!=6通りです。それ以外は、難しいそうですが、 検索エンジンで、「互いに異なる色」で検索すると結構記事があるみたいです。 30通りは、たしかどこかでみたような・・・

一般解は求められているようです。 http://www.research.att.com/~njas/sequences/?q=6%2C30%2C174%2C1092%2C7188&sort=0&fmt=0&language=english&go=Search