一、题目描述:
大致意思是:判定棋盘的状态是否符合规则
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"}
二、题目分析
解决此问题思路很明确,找出几种状态的判定条件,然后对输入进行判断。根据给出的案例。
(1)X,Y的输入顺序,即X最多比O多一个,或者相等。
Input: board = ["O ", " ", " "]
这种情况O比X多所以输出false
(2)棋盘只能存在一个赢家
Input: board = ["XXX", " ", "OOO"]
这种存在两个赢家也是False
(3)题目没有给出的一种具体情况
X X X O O _ O _ _
当X赢得胜利时,应停止输入所以应该有两个。
三、技巧与编码
(1) 表示输入顺序用一个turn 来表示,若为X则加O则减判断最后 turn的值若为0或者1则为正常。
(2)用一次两层循环记录所有的状态,整合变量的思想,记录某一行某一列的状态而不是中情况的状态。
c++代码如下:
class Solution {
public:
bool validTicTacToe(vector<string>& board) {
//定义变量
int turn=0;
int row[3]={0},col[3]={0};
int diag=0,antidiag=0;
bool winx,wino;
for(int i=0;i<=2;i++)
{
for(int j=0;j<=2;j++)
{
if(board[i][j]=='X')
{
row[i]++;
col[j]++;
turn++;
if(i==j)
{
diag++;
}
if(i+j==2)
{
antidiag++;
}
}
else if(board[i][j]=='O')
{
row[i]--;
col[j]--;
turn--;
if(i==j)
{
diag--;
}
if(i+j==2)
{
antidiag--;
}
}
}
}
winx = row[0] == 3 || row[1] == 3 || row[2] == 3 ||
col[0] == 3 || col[1] == 3 || col[2] == 3 ||
diag == 3 || antidiag == 3;
wino = row[0]==-3 || row[1] == -3 || row[2] == -3 ||
col[0] == -3 || col[1] == -3 || col[2] == -3 ||
diag == -3 || antidiag == -3;
if((winx&&turn==0) || (wino&&turn==1))
{
return false;
}
return (turn==0||turn==1)&&(!winx||!wino);//当顺序没有错误,并且两者都没有全部胜利的时候。
}
};