シューティング・スター問題(5)考察1を示します。
(5)考察1
3×3のマス目に、つぎのように番号を付ける。
変換ルール(イ)(ロ)(ハ)とマス目に付けた番号から、各マス目を押すと影響を与えるマス目はつぎのようになる。
マス目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