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; } };

浙公网安备 33010602011771号