题目

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"}.

一次遍历

1. X因为先行，数量要么和O相等，要么比O多一个
2. 如果X赢了，那么X的数量必须比O多一个（因为最后一步是X走）
3. 如果O赢了，那么O的数量和X必须相等（因为最后一步是O走）
4. XO不可能同时赢（因为一方获胜，游戏终止）

代码

class Solution {
public boolean validTicTacToe(String[] board) {
boolean xWin = false, oWin = false;
int[][] columnCount = new int;
int[][] diagonalCount = new int;
int xCount = 0, oCount = 0;
for (int i = 0; i < 3; i++) {
String row = board[i];
if (row.equals("XXX")) {
xWin = true;
} else if (row.equals("OOO")) {
oWin = true;
}
for (int j = 0; j < 3; j++) {
char c = row.charAt(j);
if (c == 'X') {
xCount++;
columnCount[j]++;
if (i == j) diagonalCount++;
if ((i + j) == 2) diagonalCount++;
} else if (c == 'O') {
oCount++;
columnCount[j]++;
if (i == j) diagonalCount++;
if ((i + j) == 2) diagonalCount++;
}
}
}
for (int i = 0; i < 3; i++) {
if (columnCount[i] == 3) xWin = true;
if (columnCount[i] == 3) oWin = true;
}
for (int i = 0; i < 2; i++) {
if (diagonalCount[i] == 3) xWin = true;
if (diagonalCount[i] == 3) oWin = true;
}
if (xWin && oWin) return false;
if (xCount < oCount || (xCount - oCount) > 1) return false;
if (xWin && xCount == oCount) return false;
if (oWin && (xCount - oCount) == 1) return false;
return true;
}
}

结果 