810. Valid Tic-Tac-Toe State
Difficulty: Medium
Topics: Math, Recursion
Similar Questions:
Problem:
A Tic-Tac-Toe board is given as a string array board
. Return True if and only if it is possible to reach this board position during the course of a valid tic-tac-toe game.
The board
is a 3 x 3 array, and consists of characters " "
, "X"
, and "O"
. The " " character represents an empty square.
Here are the rules of Tic-Tac-Toe:
- Players take turns placing characters into empty squares (" ").
- The first player always places "X" characters, while the second player always places "O" characters.
- "X" and "O" characters are always placed into empty squares, never filled ones.
- The game ends when there are 3 of the same (non-empty) character filling any row, column, or diagonal.
- The game also ends if all squares are non-empty.
- No more moves can be played if the game is over.
Example 1: Input: board = ["O ", " ", " "] Output: false Explanation: The first player always plays "X". Example 2: Input: board = ["XOX", " X ", " "] Output: false Explanation: Players take turns making moves. Example 3: Input: board = ["XXX", " ", "OOO"] Output: false Example 4: Input: board = ["XOX", "O O", "XOX"] Output: true
Note:
board
is a length-3 array of strings, where each stringboard[i]
has length 3.- Each
board[i][j]
is a character in the set{" ", "X", "O"}
.
Solutions:
class Solution {
public:
bool validTicTacToe(vector<string>& board) {
const int n = 3;
int rowCount[2][n] = {0};
int colCount[2][n] = {0};
int diag[2] = {0};
int antiDiag[2] = {0};
int count[2] = {0}; // count!!!
bool rowWin = false;
bool colWin = false;
bool winner[2] = {false};
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
if (board[i][j] == ' ') continue;
int player = (board[i][j] == 'X' ? 0 : 1);
++count[player];
if (++rowCount[player][i] == n) {
if (rowWin) return false;
else rowWin = true;
winner[player] = true;
}
if (++colCount[player][j] == n) {
if (colWin) return false;
else colWin = true;
winner[player] = true;
}
if (i == j) {
if (++diag[player] == n) {
winner[player] = true;
}
}
if (i + j == n -1) {
if (++antiDiag[player] == n) {
winner[player] = true;
}
}
}
}
if (winner[0] == true) {
return count[0] == count[1] + 1;
} else if (winner[1] == true) {
return count[0] == count[1];
} else {
return count[0] == count[1] || count[0] == count[1] + 1;
}
}
};