パズル万華鏡

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

順列生成(交換法)問題(1)の考察1

順列生成(交換法)問題(1)の考察1を示します。

問題(1)の考察1
f:id:isemba:20200223191613p:plain

' << CH101.bas >>
' 問題(1)の考察1に基づく順列生成プログラム。
' Tiny Basic
'
Public A(9)  ' 順列を保存する配列。
Public N     ' 要素数。
Public COUNT ' 生成された順列の個数。
'
Do
  ' Nの読み込み。
  Read N
  If (N <= 0) Or (N > 9) Then Exit Do
  Data 1, 2, 3, 4, 0
  '
  ' 初期設定。
  COUNT=0

  ' 順列生成。
  Call Perm(0)
  '
  ' 結果の表示。
  Print Using"N=##  COUNT=######";N;COUNT
Loop
End
'
' 順列を生成する再帰手続き。
' Kは木の深さを表す。
Sub Perm(K)
  ' 生成された順列の表示。
  If( K = N ) Then
    COUNT=COUNT+1
    Print Using"###: ";COUNT;
    For I=1 To N: Print Using"##";A(I);: Next I
    Print
    Exit Sub
  End If
  '
  ' 順列を右にひとつずらす。
  For I=K To 1 Step -1: A(I+1)=A(I): Next I
  ' 先頭に要素K+1を代入。
  A(1)=K+1 
  '
  Call Perm(K+1)
  '
  ' 深さKのK個の子節点を生成する。
  For I=2 To K+1 
    ' 1番目の要素K+1をI番目と交換。
    A(1)=A(I): A(I)=K+1
    ' 深さK+1の子節点を作成する。
    Call Perm(K+1)
    ' 状態を戻す。
    A(I)=A(1)
  Next I
  ' 順列を左にひとつずらす。
  W=A(1)
  For I=2 To K: A(I-1)=A(I): Next I
  A(K)=W
End Sub

f:id:isemba:20200223191735p:plain
f:id:isemba:20200223191748j:plain