カード配置問題・考察(1)を紹介します。
考察(1)
1からnまでの数の書かれたカードが2枚ずつある。それらを一列に並べたとき、
k(1≦k≦n)と書かれたカードの間にk枚のカードがある並べ方を考察する。
●プログラム(CR111.bas)
' << CR111.bas >> ' Tiny Basic ' カード配置問題 ' Public COUNT: ' 解の個数。 Public N: ' nの値。 Public A(19): ' カードの配置を表す配列。 Public B(19): ' 数iは現れる位置を保存する配列。 Public E(19): ' 数iの出現回数。 ' For N=2 To 9 ' 初期設定。 A(0)=0 For I=0 To N: E(I)=0: Next I COUNT=0 ' Print"N=";N Call Card(1) Print"解の個数:";COUNT Print Next N End ' ' カードの配置をすべて生成する手続き。 Sub Card(K) ' 数A(K-1)が2度目に出現したとき、一度目に出現した位置との間に、 ' A(K-1)個のカードがあるかどうかを調べる。 If E(A(K-1)) = 2 Then ' 条件を満たさないとき、戻る。 If K-1-B(A(K-1)) <> A(K-1)+1 Then Exit Sub End If ' ' 数A(K-1)が3回以上現れたとき、戻る。 If E(A(K-1)) >= 3 Then Exit Sub ' If K > 2*N Then ' 解の表示。 COUNT=COUNT+1 Print Using"####:";COUNT; For I=1 To 2*N Print Using"###";A(I); Next I Print Exit Sub End If ' ' K番目のカードA(K)を生成する。 For I=1 To N A(K)=I ' 数Iの出現回数を更新する。 E(I)=E(I)+1 ' 数Iが1回目に出現した位置B(I)を記憶する。 If E(I) = 1 Then B(I)=K Call Card(K+1) ' 数Iの出現回数を更新する。 E(I)=E(I)-1 Next I End Sub
実行結果