Skip to content

Latest commit

 

History

History
42 lines (38 loc) · 1.61 KB

794.有效的井字游戏.md

File metadata and controls

42 lines (38 loc) · 1.61 KB

这道题是一道分类讨论题,主旨是搞清楚可能的情况分类讨论。

  • 因为先手是下 ‘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;
    }
}