这个题解的思路是先统计棋盘上 'X' 和 'O' 的个数,然后再统计 'X' 和 'O' 各自形成连线获胜的次数。最后根据题目规则判断棋盘状态是否合法。具体判断标准为:1. 'O' 的个数不能大于 'X' 的个数,且 'X' 的个数最多比 'O' 多1个;2. 'X' 和 'O' 不能同时形成连线获胜;3. 如果 'X' 形成连线获胜,则此时 'X' 的个数必须恰好比 'O' 多1个;4. 如果 'O' 形成连线获胜,则此时 'X' 和 'O' 的个数必须相等。只有同时满足以上条件,才是一个合法的棋盘状态。
时间复杂度: O(1)
空间复杂度: O(1)
class Solution:
def validTicTacToe(self, board: List[str]) -> bool:
# 统计棋盘上 'O' 的个数
o_num = 0
# 统计棋盘上 'X' 的个数
x_num = 0
# 双重循环遍历棋盘
for i in range(3):
for j in range(3):
if board[i][j] == 'O':
o_num += 1
if board[i][j] == 'X':
x_num += 1
# 统计 'X' 形成连线获胜的次数
x_win_num = 0
# 统计 'O' 形成连线获胜的次数
o_win_num = 0
# 检查每一行
for i in range(3):
if board[i][0] == board[i][1] and board[i][1] == board[i][2]:
if board[i][0] == 'X':
x_win_num += 1
elif board[i][0] == 'O':
o_win_num += 1
# 检查每一列
elif board[0][i] == board[1][i] and board[1][i] == board[2][i]:
if board[0][i] == 'X':
x_win_num += 1
elif board[0][i] == 'O':
o_win_num += 1
# 检查正对角线
if board[0][0] == board[1][1] and board[1][1] == board[2][2]:
if board[0][0] == 'X':
x_win_num += 1
elif board[0][0] == 'O':
o_win_num += 1
# 检查反对角线
if board[0][2] == board[1][1] and board[1][1] == board[2][0]:
if board[2][0] == 'X':
x_win_num += 1
elif board[2][0] == 'O':
o_win_num += 1
# 判断棋盘状态是否合法
if o_num > x_num or x_num > o_num + 1:
return False
elif x_win_num > 0 and o_win_num > 0:
return False
elif x_win_num > 0 and x_num <= o_num:
return False
elif o_win_num > 0 and x_num > o_num:
return False
else:
return True