810. Valid Tic-Tac-Toe State

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 string board[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;
        }
    }
};

results matching ""

    No results matching ""