字符串一定是合法的,先统计X和O的数量,只要两种情况,一种是X比O多一个,另外一个是一样多。如果不满足,就是不合法的。
如果此时一样多,X又赢了,说明不合法,因为X已经赢了
同理,如果X比O多一个,但是O赢了也不合法。
其他都是合法情况。
由于3*3棋盘,胜利条件可以直接枚举。
class Solution {
public:
bool validTicTacToe(vector<string>& board) {
int xCount = 0, oCount = 0;
for (auto & row : board) {
for (auto c : row) {
if (c == 'X') {
xCount++;
}
if (c == 'O') {
oCount++;
}
}
}
if (oCount != xCount && oCount != xCount - 1) {
return false;
}
if (oCount == xCount && win(board, 'X')) {
return false;
}
if (oCount + 1 == xCount && win(board, 'O')) {
return false;
}
return true;
}
bool win(vector<string>& board, char p) {
for (int i = 0; i < 3; ++i) {
if (p == board[i][0] && p == board[i][1] && p == board[i][2]) {
return true;
}
if (p == board[0][i] && p == board[1][i] && p == board[2][i]) {
return true;
}
}
if (p == board[0][0] && p == board[1][1] && p == board[2][2]) {
return true;
}
if (p == board[0][2] && p == board[1][1] && p == board[2][0]) {
return true;
}
return false;
}
};