challenge 魔方分割数

1 .. N^2までの数をN個の数字の和が等しいN個のグループに分けたいと思います。

たとえば、N=3のときは、
(1) { 1, 5, 9 }, { 2, 6, 7 }, { 3, 4, 8 } 
(2) { 1, 6, 8 }, { 2, 4, 9 }, { 3, 5, 7 }
の2通りの方法があります。

ここで指定されたNに対して、何通りのグループ分けの方法があるかを数えるプログラムを作ってください。
(何通りかという値だけが出力されればよいのですが、予め計算してある結果を返すのはダメですよ。)
また、N=5を指定したときの実行時間もあわせて教えてください。

なお、数え上げるときの注意として、

・{ 1, 5, 9 } と { 1, 9, 5 }は同じもの

・{ 1, 5, 9 }, { 2, 6, 7 }, { 3, 4, 8 }と
 { 1, 5, 9 }, { 3, 4, 8 }, { 2, 6, 7 }は同じもの
とすることに注意してください。

Posted feedbacks - Groovy

理論的にはこれで解けるはずなんですが・・・
レスポンスが帰ってきません。

1.全組み合わせを作成
2.重複数がない かつ 合計が1~n^2の合計/n となる組み合わせを列挙
3.その組み合わせの中からさらに妥当な組み合わせを

という感じです。
 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
import static groovy.util.GroovyCollections.combinations

def outputMagic( n ){
    def max = n**2

    def avarage = (1..max).sum()/n
    def createLists = { list, x -> (1..x).collect{ list } }


    def pairs = combinations(createLists(1..max, n)).findAll{
        it.unique().size() == n && it.sum() == avarage
    }.collect{ it.sort() }.unique()

    combinations(createLists(pairs, n)).collect{ it.sort() }.unique().findAll{ lists ->
       def nums = []
       lists.each{ list ->
           list.each{ nums << it }
       }
       nums.unique().size() == max
    }.each{ lists ->
       println lists
    }
}

//outputMagic(3)
outputMagic(4)

Index

Feed

Other

Link

Pathtraq

loading...