新しく発言する  EXIT  インデックスへ

ライツアウト(LightsOut)をプログラムで解...


  ライツアウト(Lights Out)をプログラムで解く(PLAYモードを含む) 山中和義 2008/05/24 09:40:05 
  つづき 山中和義 2008/05/24 09:40:49 
Re: ライツアウト(Lights Out)をプログラムで解く(PLAYモードを含む)  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/05/24 09:40:49
つづき



LET clr$=REPEAT$("0",M*N)

PRINT "履歴"
DO
CALL PrintOut(M,N,ptn$) !盤面の表示

IF ptn$=clr$ THEN !ゲームクリアなら
PRINT "完成!"
STOP
END IF

MOUSE POLL x,y,left,right

IF left=1 THEN !左クリックなら
LET id=(INT(y)-1)*N+INT(x) !連番での位置
PRINT id !履歴

CALL action(ptn$, sw$(id)) !スイッチ操作

WAIT DELAY 0.3 !間隔をとる
END IF
LOOP UNTIL right=1 !右クリックなら


PRINT "盤面:";ptn$ !現在の盤面の表示

PRINT "解答 ※順番は関係なし"

LET t0=TIME


!攻略法
!・上段の行から順に消して行く
! 次の行の消し方は、上の行に依存している。
! 5×5の場合、上段の行の消し方、2^5=32通りを確認すればよい。

FOR p=2^N-1 TO 0 STEP -1 !1行目のスイッチの組合せ
LET c$=ptn$

LET bit$=right$(REPEAT$("0",N)&BSTR$(p,2),N) !2進法表記で生成する
FOR i=1 TO N
IF bit$(i:i)="1" THEN CALL action(c$, sw$(i)) !その操作
NEXT i
LET op$=bit$ !記録 ※1:押下

FOR i=2 TO M !2行から最下行まで
LET t=(i-2)*N !1つ上の行をクリアする
LET op$=op$&c$(t+1:t+N) !記録
FOR j=1 TO N
IF c$(t+j:t+j)="1" THEN CALL action(c$, sw$(t+j+N)) !その操作
NEXT j
NEXT i

IF c$=clr$ THEN !順にクリアして、偶然にもクリアしたら
FOR i=1 TO M*N !解答の表示
IF op$(i:i)="1" THEN PRINT i;
NEXT i
PRINT
END IF
NEXT p


PRINT "計算時間=";TIME-t0


END


EXTERNAL SUB action(p$, sw$) !スイッチ操作
FOR i=1 TO LEN(p$) !ビット単位の排他的論理和
LET p$(i:i)=STR$(MOD(VAL(p$(i:i))+VAL(sw$(i:i)),2))
NEXT i
END SUB

 インデックスへ  EXIT
新規発言を反映させるにはブラウザの更新ボタンを押してください。