は、ここではPythonで書かれたブルートフォースソルバーです。楽しい!あなたはN> 2でそれを実行して、ターンごとに大きなスパンを置くこともできます。失っているプレーヤーは一番左の有効な移動を再生するだけであることに注意してください。
まず、出力。私は異なるボードサイズ(ここでは2〜16)でゲームを走らせました。ここで
Size = 2
..
11
Player 1 Wins!
Size = 3
...
11.
Player 1 Wins!
Size = 4
....
.11.
Player 1 Wins!
Size = 5
.....
11...
1122.
Player 2 Wins!
Size = 6
......
..11..
2211..
221111
Player 1 Wins!
Size = 7
.......
11.....
1122...
112211.
Player 1 Wins!
Size = 8
........
.11.....
.1122...
.112211.
Player 1 Wins!
Size = 9
.........
11.......
1122.....
112211...
11221122.
Player 2 Wins!
Size = 10
..........
....11....
22..11....
22..1111..
22221111..
2222111111
Player 1 Wins!
Size = 11
...........
11.........
1122.......
112211.....
11221122...
1122112211.
Player 1 Wins!
Size = 12
............
.11.........
.1122.......
.112211.....
.11221122...
.1122112211.
Player 1 Wins!
Size = 13
.............
...11........
22.11........
22.11.11.....
22.11.1122...
22.11.112211.
Player 1 Wins!
Size = 14
..............
......11......
22....11......
22....1111....
2222..1111....
2222..111111..
222222111111..
22222211111111
Player 1 Wins!
Size = 15
...............
11.............
11...22........
1111.22........
1111.22.22.....
1111.22.2211...
1111.22.221122.
Player 2 Wins!
Size = 16
................
.....11.........
22...11.........
2211.11.........
2211.1122.......
2211.112211.....
2211.11221122...
2211.1122112211.
Player 1 Wins!
はコードです:
N = 2 # number of pieces placed per turn
CACHE = {}
def compute_moves(board):
gaps = [0] * len(board)
previous = 0
for i in range(len(board) - 1, -1, -1):
if board[i]:
previous = 0
gaps[i] = 0
else:
previous += 1
gaps[i] = previous
return [i for i, gap in enumerate(gaps) if gap >= N]
def do_move(board, index, player):
for i in range(N):
board[index + i] = player
def undo_move(board, index):
for i in range(N):
board[index + i] = 0
def search(board):
key = tuple(board)
if key in CACHE:
return CACHE[key]
moves = compute_moves(board)
for move in moves:
do_move(board, move, 1)
a, _ = search(board)
undo_move(board, move)
if not a:
result = (True, move)
break
else:
result = (False, moves[0] if moves else None)
CACHE[key] = result
return result
def play(board):
player = 0
while True:
print ''.join(str(x or '.') for x in board)
_, index = search(board)
if index is None:
break
do_move(board, index, player + 1)
player = int(not player)
print 'Player %d Wins!' % (int(not player) + 1)
for size in range(2, 17):
print 'Size = %d' % size
board = [0] * size
play(board)
print
あなたが特定の状態が勝敗の場合はどのようにマークを付けますか?また、Kとは何ですか? – user1248092
@ user1248092上記の私の擬似コードを参照してください。数字「k」は任意の整数である。ポイントは撮影スポットの数が常に偶数であるため、非負整数kの場合は(例えば撮影スポット数が14の場合は4k、4k + 2のいずれか、 '14 = 4 * 3 + 2 'なので' k = 3')。 – PengOne
私はボード[0,0,0,0]であなたのコードを実行しましたが、それは偽と言いました。 P1が勝つはずです。 – user1248092