|
> No.1959[元記事へ]
YUさんへのお返事です。
> ┏━┳━┳━┳━┳━┓
> ┃始┃B┃C┃B┃C┃
> ┣━╋━╋━╋━╋━┫
> ┃C┃A┃A┃C┃B┃
> ┣━╋━╋━╋━╋━┫
> ┃B┃A┃B┃C┃A┃
> ┣━╋━╋━╋━╋━┫
> ┃C┃B┃C┃A┃B┃
> ┣━╋━╋━╋━╋━┫
> ┃A┃C┃A┃C┃終┃
> ┗━┻━┻━┻━┻━┛
LET M=5 !マスの大きさ M×N
LET N=5
DATA 9,1,2,1,2 !A=0,B=1,C=2
DATA 2,0,0,2,1
DATA 1,0,1,2,0
DATA 2,1,2,0,1
DATA 0,2,0,2,9
LET P=4 !自手の手数
PRINT "最少手数=";M+N-2
PUBLIC NUMERIC C !解の個数
LET C=0
DIM A(M,N) !マスの手
MAT READ A
DIM R(M,N)
MAT R=(-1)*CON
DIM B(P) !自手のパターン(並び)
FOR i=0 TO 3^P-1 !3^P通り
LET t=i
FOR J=1 TO P !3進法p桁へ
LET B(P-J+1)=MOD(t,3)
LET t=INT(t/3)
NEXT J
MAT PRINT USING REPEAT$(" #",P): B;
PRINT " の場合"
LET X=1 !Y行X列 ※左上がスタート位置
LET Y=1
LET R(Y,X)=0 !進路
CALL try(0,Y,X,M,N,A,P,B,R)
NEXT i
END
EXTERNAL SUB try(S,Y,X,M,N,A(,),P,B(),R(,)) !バックトラック法で検索する
IF X>1 THEN !左端以外なら左へ(列の範囲を確認する)
IF R(Y,X-1)<0 THEN !未踏なら
CALL Judge(S,Y,X-1,M,N,A,P,B,R)
END IF
END IF
IF X<N THEN !右端以外なら右へ(列の範囲を確認する)
IF R(Y,X+1)<0 THEN !未踏なら
IF Y=M AND X+1=N THEN !右下なら、ゴール!
LET C=C+1 !結果を表示する
PRINT "No.";C
MAT PRINT USING REPEAT$(" ##",N): R; !進路
PRINT " ";S+1;"手" !手数
ELSE
CALL Judge(S,Y,X+1,M,N,A,P,B,R)
END IF
END IF
END IF
IF Y>1 THEN !上端以外なら上へ(行の範囲を確認する)
IF R(Y-1,X)<0 THEN !未踏なら
CALL Judge(S,Y-1,X,M,N,A,P,B,R)
END IF
END IF
IF Y<M THEN !下端以外なら下へ(行の範囲を確認する)
IF R(Y+1,X)<0 THEN !未踏なら
IF Y+1=M AND X=N THEN !右下なら、ゴール!
LET C=C+1
PRINT "No.";C
MAT PRINT USING REPEAT$(" ##",N): R; !進路
PRINT " ";S+1;"手" !手数
ELSE
CALL Judge(S,Y+1,X,M,N,A,P,B,R)
END IF
END IF
END IF
END SUB
EXTERNAL SUB Judge(S,Y,X,M,N,A(,),P,B(),R(,)) !対戦を判定する
FOR L=1 TO P !連続P回の引き分けまで
LET SS=S+L
LET me=B(MOD(SS-1,P)+1) !自手(巡回させる)を得る
LET you=A(Y,X)
LET W=MOD(you-me+3,3) !判定 ※0=引き分け,1=勝ち,2=負け
IF W=2 THEN !負けなら
EXIT FOR !終了!!!
ELSEIF W=1 THEN !勝ちなら、進める
LET R(Y,X)=SS !仮に進める
CALL try(SS,Y,X,M,N,A,P,B,R) !次の対戦へ
LET R(Y,X)=-1 !元に戻す
EXIT FOR !終了!!!
END IF
NEXT L
END SUB
実行結果
最少手数= 8
0 0 0 0 の場合
0 0 0 1 の場合
0 0 0 2 の場合
0 0 1 0 の場合
0 0 1 1 の場合
0 0 1 2 の場合
0 0 2 0 の場合
0 0 2 1 の場合
No. 1
0 1 -1 -1 -1
4 3 11 12 13
5 7 9 16 15
-1 -1 20 19 -1
-1 -1 23 24 -1 25 手
No. 2
0 1 -1 -1 -1
4 3 11 12 13
5 7 9 16 15
-1 -1 -1 19 21
-1 -1 -1 -1 -1 22 手
No. 3
0 1 -1 -1 -1
4 3 11 12 13
5 7 9 16 15
-1 -1 -1 19 -1
-1 -1 -1 20 -1 21 手
No. 4
0 1 -1 -1 -1
4 3 11 12 13
5 7 9 -1 15
-1 -1 20 19 17
-1 -1 23 24 -1 25 手
No. 5
0 1 -1 -1 -1
4 3 11 12 13
5 7 9 -1 15
-1 -1 -1 19 17
-1 -1 -1 20 -1 21 手
No. 6
0 1 -1 -1 -1
4 3 11 12 13
5 7 9 -1 15
-1 -1 -1 -1 17
-1 -1 -1 -1 -1 18 手
0 0 2 2 の場合
0 1 0 0 の場合
0 1 0 1 の場合
0 1 0 2 の場合
No. 7
0 1 2 -1 -1
-1 -1 4 -1 -1
-1 -1 5 6 8
-1 -1 -1 -1 9
-1 -1 -1 -1 -1 10 手
No. 8
0 1 2 -1 -1
-1 -1 4 -1 -1
-1 -1 5 6 -1
-1 -1 -1 8 9
-1 -1 -1 -1 -1 10 手
No. 9
0 1 2 -1 -1
-1 -1 4 -1 -1
-1 -1 5 -1 -1
-1 -1 6 8 9
-1 -1 -1 -1 -1 10 手
0 1 1 0 の場合
0 1 1 1 の場合
0 1 1 2 の場合
0 1 2 0 の場合
0 1 2 1 の場合
No. 10
0 1 2 -1 -1
-1 -1 3 -1 -1
-1 -1 5 6 7
-1 -1 -1 -1 9
-1 -1 -1 -1 -1 10 手
No. 11
0 1 2 -1 -1
-1 -1 3 -1 -1
-1 -1 5 6 -1
-1 9 8 7 -1
-1 10 11 12 -1 13 手
:
:
|
|