パズル万華鏡

面白いパズルの紹介と解説をします。

数の五線星形問題・考察(1)

 数の五線星形問題・考察(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になる配置を考察する。
f:id:isemba:20151102144752j:plain
 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の対応
f:id:isemba:20151102144832j:plain
・五線星形の対称性から、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

実行結果
f:id:isemba:20151102145012j:plain
f:id:isemba:20151102145022j:plain