/*
* @lc app=leetcode id=794 lang=cpp
*
* [794] Valid Tic-Tac-Toe State
*/
// @lc code=start
class Solution {
public:
bool validTicTacToe(vector<string>& board) {
vector<int> r(3), c(3);
int xc = 0, oc = 0, diag = 0, adiag = 0;
bool xwin = false, owin = false;
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 3; ++j) {
if (board[i][j] == 'X') {
++xc;
++r[i];
++c[j];
if (i == j) ++diag;
if (i == 2 - j) ++adiag;
} else if (board[i][j] == 'O') {
++oc;
--r[i];
--c[j];
if (i == j) --diag;
if (i == 2 - j) --adiag;
}
if (r[i] == 3 || c[j] == 3 || diag == 3 || adiag == 3) {
xwin = true;
} else if (r[i] == -3 || c[j] == -3 || diag == -3 || adiag == -3) {
owin = true;
}
}
}
if (!(xc == oc || xc == oc + 1)) return false;
if (xwin && xc == oc) return false;
if (owin && (xwin || xc == oc + 1)) return false;
return true;
}
};
// @lc code=end