パズル万華鏡

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

数の長方形問題考察(2)

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


考察(2)

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

●プログラム(NT111.bas)

' << NT111.bas >>
' Tiny Basic
' 数の長方形問題を解くプログラム。
'
Public N:     ' nの値。
Public M:     ' 辺の合計値。
Public R:     ' rの値。
Public COUNT: ' 部分順列の個数。
Public P(10): ' 部分順列を保存する配列
'
' 初期設定。
N=10
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
End                                      
'
' 部分順列を生成する手続き。
' Kは部分順列K番目の要素を意味する。
Sub Perm(K)
  If K = 4 Then
    S=P(1)+P(2)+P(3)
    If S <> M Then Exit Sub
    ' 左右に対称の配置を同一視する。。
    If P(1) > P(3) Then Exit Sub
  End If
  '
  If K = 7 Then
    S=P(3)+P(4)+P(5)+P(6)
    If S <> M Then Exit Sub
    ' ④と⑤を交換したものを同一視する。
    If P(4) > P(5) Then Exit Sub
  End If
  '
  If K = 9 Then
    S=P(6)+P(7)+P(8)
    If S <> M Then Exit Sub
    ' 上下に対称の配置を同一視する。。
    If P(2) > P(7) Then Exit Sub
  End If

  If K > R Then
    S=P(8)+P(9)+P(10)+P(1)
    If S <> M Then Exit Sub
    ' ⑨と⑩を交換したものを同一視する。
    If P(9) > P(10) Then Exit Sub
    ' 解の表示。
    COUNT=COUNT+1                                
    Print Using"[##]";COUNT;                     
    ' 長方形の頂点をかっこで囲む。
    For I=1 To R                                 
      If (I = 1) Or (I = 3) or (I = 6) or (I = 8) Then
        Print" (";
      End If             
      Print Using"##";P(I);                      
      If (I = 1) Or (I = 3) or (I = 6) or (I = 8) Then 
         Print")";
      End If              
    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 17, 18, 19, 20, 21, 22, 0

実行結果
f:id:isemba:20150915181557j:plain
f:id:isemba:20150915181606j:plain