这道题是一道分类讨论题,主旨是搞清楚可能的情况分类讨论。
- 因为先手是下 ‘X’,后手再下 'O',所以 X 的数量一定是大于等于 O 的数量,且当两者不等时差值不超过1
- 若先手赢,即某次下完 'X' 之后就赢了,此时 X 的数量比 O 的数量多1
- 若后手赢,即某次下完 'O' 之后赢了,此时 O 的数量和 X 的数量是相等的
class Solution {
public boolean validTicTacToe(String[] board) {
int cnt_X = 0, cnt_O = 0;
for (int i = 0; i < board.length; i++) {
for (Character ch : board[i].toCharArray()) {
if (ch == 'X') cnt_X++;
if (ch == 'O') cnt_O++;
}
}
if (cnt_X != cnt_O && cnt_X - cnt_O != 1) return false;
if (win(board, 'X') && cnt_X - cnt_O != 1) return false;
if (win(board, 'O') && cnt_O != cnt_X) return false;
return true;
}
public boolean win(String[] board, Character p) {
for (int i = 0; i < board.length; i++) {
if (p == board[i].charAt(0) && p == board[i].charAt(1) && p == board[i].charAt(2)) {
return true;
}
if (p == board[0].charAt(i) && p == board[1].charAt(i) && p == board[2].charAt(i)) {
return true;
}
}
if (p == board[0].charAt(0) && p == board[1].charAt(1) && p == board[2].charAt(2)) {
return true;
}
if (p == board[0].charAt(2) && p == board[1].charAt(1) && p == board[2].charAt(0)) {
return true;
}
return false;
}
}