794. 有效的井字游戏
题目描述
给你一个字符串数组 board 表示井字游戏的棋盘。当且仅当在井字游戏过程中,棋盘有可能达到 board 所显示的状态时,才返回 true 。
井字游戏的棋盘是一个 3 x 3 数组,由字符 ' ','X' 和 'O' 组成。字符 ' ' 代表一个空位。
以下是井字游戏的规则:
- 玩家轮流将字符放入空位(
' ')中。 - 玩家 1 总是放字符 
'X',而玩家 2 总是放字符'O'。 'X'和'O'只允许放置在空位中,不允许对已放有字符的位置进行填充。- 当有 3 个相同(且非空)的字符填充任何行、列或对角线时,游戏结束。
 - 当所有位置非空时,也算为游戏结束。
 - 如果游戏结束,玩家不允许再放置字符。
 
示例 1:
输入:board = ["O "," "," "] 输出:false 解释:玩家 1 总是放字符 "X" 。
示例 2:
输入:board = ["XOX"," X "," "] 输出:false 解释:玩家应该轮流放字符。
示例 3:
输入:board = ["XOX","O O","XOX"] 输出:true
提示:
board.length == 3board[i].length == 3board[i][j]为'X'、'O'或' '
解法
方法一:分类讨论
我们先统计当前棋盘上 'X' 和 'O' 的数量,记为 \(x\) 和 \(o\)。接下来,我们分情况讨论:
- 如果 \(x \neq o\) 且 \(x - 1 \neq o\),则当前棋盘不可能是有效棋盘,返回 
false。 - 如果当前棋盘上玩家 1 获胜,但 \(x-1 \neq o\),则当前棋盘不可能是有效棋盘,返回 
false。 - 如果当前棋盘上玩家 2 获胜,但 \(x \neq o\),则当前棋盘不可能是有效棋盘,返回 
false。 - 其他情况下,当前棋盘是有效棋盘,返回 
true。 
时间复杂度 \(O(C)\),空间复杂度 \(O(1)\)。其中 \(C\) 是棋盘上的格子数。本题中 \(C = 9\)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19  |  | 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42  |  | 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23  |  | 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33  |  | 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37  |  | 


