数の五線星形問題・考察(2)
考察(2)
五線星形の10個の○の中に、1から11までの数字の内、10個を選び入れる。
5本の直線上に並ぶ数の和(A+C+F+I,A+D+G+J,B+C+D+E,B+F+H+J,E+G+H+I)が
いずれも同じになる配置を考察する。
1~11までの数から10個の数を選んだ和をM、5本の直線上に並ぶ数の和をmとする。
A+C+F+I=A+D+G+J=B+C+D+E=B+F+H+J=E+G+H+I=m
A+B+C+D+E+F+G+H+I+J=M
このとき、5m=2M が成り立つ。
したがって、Mは55以上65以下であるから、2×55≦5m≦2×65となり、
22≦m≦26を得る。
プログラム(FS121.bas)の結果から条件を満たす解はないことがわかった。
●プログラムの工夫
・集合{1,2,…,11}上の長さ10の部分順列をすべて生成していく。
・生成される順列P(1)P(2)…P(10)と辺上の数A,B,…,Jの対応
・五線星形の対称性から、AにA,B,E,I,Jの最小値を割り当て、B<Eが成り立つものを求める。
●プログラム(FS121.bas)
' << FS121.bas >> ' Tiny Basic ' 数の五線星形問題を解くプログラム。 ' Public N: ' 集合{1,2,…,11}の要素数。 Public M: ' 辺の合計値。 Public R: ' 集合{1,2,…,11}上の部分順列の長さ。 Public COUNT: ' 部分順列の個数。 Public P(11): ' 部分順列を保存する配列 ' ' 初期設定。 N=11 R=10 ' Do ' 辺の合計値Mの読み込み。 Read M If M <= 0 Then Exit Do ' ' 初期設定。 COUNT=0 For I=1 To N: P(I)=I: Next I ' ' 部分順列の生成。 Call Perm (1) Print"辺の合計値=";M;" 解の個数:";COUNT Print Loop ' ' データ。 Data 22,23,24,25,26,0 End ' ' 部分順列をすべて生成する手続き。 ' Kは部分順列K番目の要素を意味する。 Sub Perm(K) If K = 3 Then If P(2) < P(1) Then Exit Sub End If ' If K = 6 Then If P(5) < P(1) Then Exit Sub If P(5) < P(2) Then Exit Sub S=P(2)+P(3)+P(4)+P(5) If S <> M Then Exit Sub End If ' If K = 10 Then If P(9) < P(1) Then Exit Sub S=P(1)+P(3)+P(6)+P(9) If S <> M Then Exit Sub S=P(5)+P(7)+P(8)+P(9) If S <> M Then Exit Sub End If ' If K = 11 Then If P(10) < P(1) Then Exit Sub S=P(1)+P(4)+P(7)+P(10) If S <> M Then Exit Sub S=P(2)+P(6)+P(8)+P(10) If S <> M Then Exit Sub End If ' If K > R Then ' 解の表示。 COUNT=COUNT+1 Print Using"[##]";COUNT; For I=1 To R: Print Using"###";P(I);: Next I Print Exit Sub End If ' ' つぎの位置の要素を指定する。 For I=K To N W=P(K): P(K)=P(I): P(I)=W Call Perm(K+1) W=P(K): P(K)=P(I): P(I)=W Next I End Sub
実行結果
寄せ植えをしてみました(1/3)。