数の五線星形問題・考察(1)を紹介します。
考察(1)
五線星形の10個の○の中に1から10までの数字を入れる、
5本の直線上に並ぶ数の和(A+C+F+I,A+D+G+J,B+C+D+E,B+F+H+J,E+G+H+I)が
いずれも22になる配置を考察する。
1~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であるから、5m=110となり、m=22を得る。
プログラム(FS111.bas)の結果から条件を満たす解はないことがわかった。
●プログラムの工夫
・集合{1,2,…,10}上の順列をすべて生成していく。
・生成される順列P(1)P(2)…P(10)と辺上の数A,B,…,Jの対応
・五線星形の対称性から、AにA,B,E,I,Jの最小値を割り当て、B<Eが成り立つものを求める。
●プログラム(FS111.bas)
' << FS111.bas >> ' Tiny Basic ' 数の五線星形問題を解くプログラム。 ' Public N: ' 集合{1,2,…,11}の要素数。 Public M: ' 辺の合計値。 Public COUNT: ' 部分順列の個数。 Public P(10): ' 部分順列を保存する配列 ' ' 初期設定。 N=10 ' ' 辺の合計値Mの設定。 M=22 ' ' 初期設定。 COUNT=0 For I=1 To N: P(I)=I: Next I ' ' 部分順列の生成。 Call Perm (1) Print"辺の合計値=";M;" 解の個数:";COUNT Print End ' ' 集合{1,2,…,10}上のすべての順列を生成する手続き。 ' 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 > 10 Then ' 解の表示。 COUNT=COUNT+1 Print Using"[##]";COUNT; For I=1 To 10: 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
実行結果