パズル万華鏡

現在、プログラミング技術の紹介と解説をしています。

数の十字形問題の考察(2)

 数の十字形問題の考察(2)を紹介します。

考察(2)

 プログラムによる解の探索を考察する。
f:id:isemba:20160410095651j:plain
を解とすると、

 縦列①、②、④、⑤は入れ替えても同じ。

したがって、①<②<④<⑤という条件をつける。

 横列⑥、⑦、⑧、⑨も入れ替えても同じ。

したがって、⑥<⑦<⑧<⑨という条件をつける。

 縦列と横列を入れ替えても同じ。

したがって、①<⑥という条件をつける。

●プログラム(CT111.bas)

' << CT111.bas >>
' Tiny Basic
'
' 数の十字形問題を解くプログラム。
'
Public N:     ' nの値。
Public M:     ' 列の合計値。
Public R:     ' rの値。
Public COUNT: ' 部分順列の個数。
Public P(10): ' 部分順列を保存する配列
'
' 初期設定。
N=9
R=9
'
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
End                                      
'
' 部分順列を生成する手続き。
' Kは部分順列K番目の要素を意味する。
Sub Perm(K)
  If K = 6 Then
    S=P(1)+P(2)+P(3)+P(4)+P(5)
    If S <> M Then Exit Sub
    ' 条件①<②<④<⑤を満たさなければ、戻る。
    If P(1) > P(2) Then Exit Sub
    If P(2) > P(4) Then Exit Sub
    If P(4) > P(5) Then Exit Sub
  End If
  '
  If K > R Then
    S=P(6)+P(7)+P(3)+P(8)+P(9)
    If S <> M Then Exit Sub
    ' 
    ' 条件⑥<⑦<⑧<⑨を満たさなければ、戻る。
    If P(6) > P(7) Then Exit Sub
    If P(7) > P(8) Then Exit Sub
    If P(8) > P(9) Then Exit Sub
    ' 条件①<⑥を満たさなければ、戻る。
    If P(1) > P(6) Then Exit Sub
    '
    ' 解の表示。
    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
'
' データ。
Data 23, 24, 25, 26, 27, 0

実行結果
f:id:isemba:20160410100122j:plain
f:id:isemba:20160410100135j:plain