パズル万華鏡

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

シューティング・スター問題(5)考察1

シューティング・スター問題(5)考察1を示します。

(5)考察1

 3×3のマス目に、つぎのように番号を付ける。

f:id:isemba:20141017091443j:plain

 変換ルール(イ)(ロ)(ハ)とマス目に付けた番号から、各マス目を押すと影響を与えるマス目はつぎのようになる。

マス目1を押すと影響を与えるマス目:{1,2,4,5}
マス目2を押すと影響を与えるマス目:{1,2,3}
マス目3を押すと影響を与えるマス目:{2,3,5,6}
マス目4を押すと影響を与えるマス目:{1,4,7}
マス目5を押すと影響を与えるマス目:{2,4,5,6,8}
マス目6を押すと影響を与えるマス目:{3,6,9}
マス目7を押すと影響を与えるマス目:{4,5,7,8}
マス目8を押すと影響を与えるマス目:{7,8,9}
マス目9を押すと影響を与えるマス目:{5,6,8,9}

●プログラム(SS111.bas)

' << SS111.bas >>
' シューティングスター        
'
Dim A(10,10): ' A(i,*):マス目番号iを押すと影響を受けるマス目番号を
              ' 保存する配列。
Dim T(26,10): ' 問題を保存する配列。
              ' T(i,j):i番目の問題、マス目番号jの状態。
              '     問題Aが1番目、問題Bが2番目、… とする。
              '         0は消灯状態、1は点灯状態。
Dim C(10):    ' マス目番号iが押された回数。
Dim X(10):    ' マス目の初期状態。0は消灯状態、1は点灯状態。
Dim Y(10):    ' マス目の最終状態。0は消灯状態、1は点灯状態。
'
' マス目番号Iを押すと影響を受けるマス目番号を配列Aに読み込む。
' 0は該当マス目の終了を意味する。
For I=1 To 9
  For J=1 To 5: Read A(I,J): Next J
Next I
'
Data 1,2,4,5,0
Data 1,2,3,0,0
Data 2,3,5,6,0
Data 1,4,7,0,0
Data 2,4,5,6,8
Data 3,6,9,0,0
Data 4,5,7,8,0
Data 7,8,9,0,0
Data 5,6,8,9,0
'
' 問題の読み込み。
Do
  Read N$
  If N$ = "Z" Then Exit Do
  N=Asc(N$)-Asc("A")+1
  For I=1 To 9: Read T(N,I): Next I
Loop
' 問題のデータ。
Data "A",  1,1,1,1,1,1,1,1,1
Data "B",  0,1,1,1,1,1,1,1,1
Data "C",  1,0,1,1,1,1,1,1,1
Data "D",  0,0,1,1,1,1,1,1,1
Data "E",  0,1,0,1,1,1,1,1,1
Data "F",  0,1,1,1,0,1,1,1,1
Data "G",  0,1,1,1,1,1,1,1,0
Data "H",  0,0,0,1,1,1,1,1,1
Data "I",  1,1,1,0,0,0,1,1,1
Data "J",  0,1,1,1,0,1,1,1,0
Data "K",  0,0,1,0,1,1,1,1,1
Data "L",  0,0,0,1,0,1,1,1,1
Data "M",  1,0,1,0,1,0,1,0,1
Data "N",  0,0,1,1,0,1,1,1,0
Data "O",  0,1,0,1,0,1,1,0,1
Data "Z"
'
' 最終状態の設定。
For I=1 To 9
  If I = 5 Then Y(I)=0 Else Y(I)=1
Next I
'
Do
  ' 初期設定。
  For I=1 To 9: C(I)=0: Next I
  '
  ' 問題の選択。
  Input"問題(A-O[A])をきめてください(Zで終了)";M$
  If M$ = "" Then M$="A"
  If M$ = "Z" Then Stop
  '
  ' 初期状態の設定。
  M=Asc(M$)-Asc("A")+1
  For I=1 To 9: X(I)=T(M,I): Next I
  ' 
  Do
    ' 現在の状態、目標の状態を表示。             
    Print"現在の状態 目標の状態"                
    For I=1 To 3                                             
      For J=1 To 3                                           
        K=3*(I-1)+J                                          
        If X(K) = 0 Then C$="■" Else C$="□"                
        Print C$;                                            
      Next J                                     
      Print Space$(6);                           
      For J=1 To 3                                           
        K=3*(I-1)+J                                          
        If Y(K) = 0 Then C$="■" Else C$="□"                
        Print C$;                                            
      Next J                                                 
      Print                                                  
    Next I                                                   
    Print                                                    
    '                                            
    ' 押すマス目番号を指定する。
    Input Z                                      
    If Z = 0 Then Exit Do                        
    Print"マス目番号:";Z                        
    C(Z)=C(Z)+1                                  
    '                                            
    ' 状態を更新(点灯状態→消灯状態、消灯状態→点灯状態)。
    For J=1 To 5                                 
      W=A(Z,J)                                   
      If W > 0 Then                              
        X(W)=1-X(W)                              
      End If                                     
    Next J                                       
    '                                            
    ' 押された有効なマス目番号。
    ' マス目を偶数回押すと1回も押さなかったことと同等になる。
    ' したがって、奇数回押されたマス目番号を有効とする。
    Print"押された有効なマス目番号";
    For I=1 To 9
      If C(I) Mod 2 = 1 Then Print Using"###";I;
    Next I
    Print: Print
    '
    ' 最終状態かどうか判定。                     
    For I=1 To 9                                 
      If X(I) <> Y(I) Then Exit For              
    Next I                                       
    If I > 9 Then                                
      Print"完成!!": Exit Do                   
    End If                                       
  Loop
Loop
End

f:id:isemba:20141017091700j:plain

f:id:isemba:20141017091713j:plain