给定一个 8x8 的棋盘 board
,每个格子有三种可能的状态:
'.'
表示空格'W'
表示白色格子'B'
表示黑色格子现在你要对一个空格 (rMove, cMove)
进行涂色操作,颜色为 color
(白色 'W'
或黑色 'B'
)。涂色操作的合法性判断规则是:
(rMove, cMove)
这个格子必须是 “好线段” 的一个端点。“好线段” 定义如下:
简言之,这相当于反转棋类游戏中一条“夹击”的规则:新涂色位置必须和已有颜色形成“端点”,并且中间夹着连续的对手颜色。
本题关键点在于判断,以待涂色点 (rMove, cMove)
作为端点,是否存在符合规则的“好线段”。
opponent
)。这种方案不修改棋盘原状态,通过逻辑推断判断合法性。
核心步骤:
directions = [
(0, 1), (0, -1),
(1, 0), (-1, 0),
(1, 1), (1, -1),
(-1, 1), (-1, -1)
]
(rMove, cMove)
移动到下一个格子 (r, c)
。board[r][c]
。True
。False
。class Solution:
def checkMove(self, board: List[List[str]], rMove: int, cMove: int, color: str) -> bool:
directions = [
(0, 1), (0, -1),
(1, 0), (-1, 0),
(1, 1), (1, -1),
(-1, 1), (-1, -1)
]
def in_board(r, c):
return 0 <= r < 8 and 0 <= c < 8
for dr, dc in directions:
r, c = rMove + dr, cMove + dc
# 第一个格子必须是对手颜色
if not in_board(r, c) or board[r][c] == '.' or board[r][c] == color:
continue
opponent = board[r][c]
length = 2 # 包含端点和第一个对手格
r += dr
c += dc
while in_board(r, c) and board[r][c] == opponent:
length += 1
r += dr
c += dc
# 检查末尾是否为当前颜色,且长度≥3
if length >= 3 and in_board(r, c) and board[r][c] == color:
return True
return False
示例1:
board = [
[".", ".", ".", "B", ".", ".", ".", "."],
[".", ".", ".", "W", ".", ".", ".", "."],
[".", ".", ".", "W", ".", ".", ".", "."],
[".", ".", ".", "W", ".", ".", ".", "."],
["W", "B", "B", ".", "W", "W", "W", "B"],
[".", ".", ".", "B", ".", ".", ".", "."],
[".", ".", ".", "B", ".", ".", ".", "."],
[".", ".", ".", "W", ".", ".", ".", "."]
]
rMove, cMove, color = 4, 3, "B"
(4,3)
为空格,涂为 'B'
后,沿竖直方向向上找:
'W'
(对手颜色)'W'
格子 (3,3), (2,3), (1,3)
'B'
(涂色颜色)True
示例2:
board = [
[".", ".", ".", ".", ".", ".", ".", "."],
[".", "B", ".", ".", "W", ".", ".", "."],
[".", ".", "W", ".", ".", ".", ".", "."],
[".", ".", ".", "W", "B", ".", ".", "."],
[".", ".", ".", ".", ".", ".", ".", "."],
[".", ".", ".", ".", "B", "W", ".", "."],
[".", ".", ".", ".", ".", ".", "W", "."],
[".", ".", ".", ".", ".", ".", ".", "B"]
]
rMove, cMove, color = 4, 4, "W"
(4,4)
虽然会产生好线段,但该点处于线段中间,不是端点。False