题目描述:
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"}
.
class Solution {
public:
bool validTicTacToe(vector<string>& board) {
int x_count=0;
int o_count=0;
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
if(board[i][j]=='X') x_count++;
else if(board[i][j]=='O') o_count++;
}
}
bool x_win=isWin(board,'X');
bool o_win=isWin(board,'O');
if(x_count<o_count||x_count>o_count+1) return false;
else if(x_count==o_count&&x_win) return false; // 当X和O数目相同时,最后一步必定是O,那么在这之前棋局不能结束
else if(x_count==o_count+1&&o_win) return false; // 当X比O数目大一时,最后一步必定是X,那么在这之前棋局不能结束
return true;
}
bool isWin(vector<string>& board, char c)
{
for(int i=0;i<3;i++)
if(board[i][0]==c&&board[i][0]==board[i][1]&&board[i][1]==board[i][2]) return true;
for(int j=0;j<3;j++)
if(board[0][j]==c&&board[0][j]==board[1][j]&&board[1][j]==board[2][j]) return true;
if(board[0][0]==c&&board[0][0]==board[1][1]&&board[1][1]==board[2][2]) return true;
if(board[2][0]==c&&board[2][0]==board[1][1]&&board[1][1]==board[0][2]) return true;
return false;
}
};