LeetCode 794. Valid Tic-Tac-Toe State

题不难,但是考虑的时候要全面,很可能漏掉一些条件。

首先要判断棋子个数是否合法。由于X先动,所以X的个数要么比O多一个(O还没下),要么和O相等(O下好了)。

一开始我做的时候,只想到win的只可能一个,就用了一个count_win,判断是不是1。但是这样做是不对的,因为赢了以后,游戏是立即结束的,如果两方还继续下了,其实也是非法的。

那么仔细考虑一下赢的时候。如果X赢了,X的棋子一定比O多一个。如果O赢了,O的棋子一定是和X相等的。

就算有多种赢的三个棋子,这两个判断不可能同时通过,因此一定会返回false。

class Solution {
public:
    bool validTicTacToe(vector<string>& board) {
        int count_X=0;
        int count_O=0;
        for (int i=0;i<board.size();++i){
            for (int j=0;j<board[0].size();++j){
                if (board[i][j]=='X') ++count_X;
                if (board[i][j]=='O') ++count_O;
            }
        }
        // count_X == count_O   or   count_X == count_O+1
        if (count_X<count_O || count_X>count_O+1) return false;
        
        if (win(board,'X') && count_X!=count_O+1) return false;
        if (win(board,'O') && count_X!=count_O) return false;
        
        return true;
    }
    
    bool win(vector<string> &board, char ch){
        for (int i=0;i<3;++i){
            if (board[i][0]==ch && board[i][1]==ch && board[i][2]==ch) return true;
            if (board[0][i]==ch && board[1][i]==ch && board[2][i]==ch) return true;
        }
        if (board[0][0]==ch && board[1][1]==ch && board[2][2]==ch) return true;
        if (board[0][2]==ch && board[1][1]==ch && board[2][0]==ch) return true;
        return false;
    }
};

 

posted @ 2018-11-14 09:45  約束の空  阅读(371)  评论(0)    收藏  举报