794. Valid Tic-Tac-Toe State
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"}
.
Approach #1: Simulate. [Java]
class Solution { public boolean validTicTacToe(String[] board) { int numX = 0; int numO = 0; for (String str : board) { for (int i = 0; i < str.length(); ++i) { if (str.charAt(i) == 'X') numX++; else if (str.charAt(i) == 'O') numO++; } } if (numO > numX) return false; // ["O ", " ", " "] if (numX > numO+1) return false; // ["XOX", " X ", " "] if (gameOver(board, 'X') && numX == numO) return false; // ["XXX", " ", "OOO"] if (gameOver(board, 'O') && numX > numO) return false; // ["OXX","XOX","OXO"] return true; } private boolean gameOver(String[] board, char c) { char[][] charArr = new char[3][3]; for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { charArr[i][j] = board[i].charAt(j); } } // top if (charArr[0][1] == c && charArr[0][0] == c && charArr[0][2] == c) return true; // bottom if (charArr[1][1] == c && charArr[1][0] == c && charArr[1][2] == c) return true; // left if (charArr[1][0] == c && charArr[0][0] == c && charArr[2][0] == c) return true; // right if (charArr[1][2] == c && charArr[0][2] == c && charArr[2][2] == c) return true; // center if (charArr[1][1] == c && charArr[0][1] == c && charArr[2][1] == c) return true; if (charArr[1][1] == c && charArr[1][0] == c && charArr[1][2] == c) return true; if (charArr[1][1] == c && charArr[0][2] == c && charArr[2][0] == c) return true; if (charArr[1][1] == c && charArr[0][0] == c && charArr[2][2] == c) return true; return false; } }
永远渴望,大智若愚(stay hungry, stay foolish)