パズル万華鏡

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

カード配置問題・考察(1)

 カード配置問題・考察(1)を紹介します。

考察(1)

 1からnまでの数の書かれたカードが2枚ずつある。それらを一列に並べたとき、
k(1≦k≦n)と書かれたカードの間にk枚のカードがある並べ方を考察する。
f:id:isemba:20151103092857j:plain
●プログラム(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

実行結果
f:id:isemba:20151103093016j:plain
f:id:isemba:20151103093026j:plain