描述
一个井字棋盘以字符串数组 board
的形式给出。返回true
当且仅当在一个合法的井字棋游戏当中可能到达当前这种棋盘情况。
board
是一个 3 x 3 的数组, 包含字符' '
, 'X'
, 和'O'
。字符 ’ '意味着这一格是空的。
以下是井字棋的游戏规则:
- 玩家需要轮流在空格上放置字符。
- 第一个玩家总是放置
'X'
字符,第二个玩家总是放置'O'
字符。 'X'
和'O'
总是被放置在空格上,不能放置在已有字符的格子上。- 当有3格相同的(非空)字符占据一行、一列或者一个对角线的时候,游戏结束。
- 当所有格子都非空的时候游戏也结束。
- 游戏结束后不允许多余操作。
说明
board
是一个长度为3的字符串数组,其中每一个字符串board[i]
的长度为3.- 每一个
board[i][j]
是一个在集合{' ', 'X', 'O'}
当中的字符.
样例
- 样例1:
输入:board = ["O ", " ", " "]
输出:false
解释:第一个玩家总是放置"X".
- 样例2:
输入: board = ["XOX", " X ", " "]
输出: false
解释:玩家轮流操作.
- 样例3:
输入: board = ["XXX", " ", "OOO"]
输出: false
- 样例4:
输入: board = ["XOX", "O O", "XOX"]
输出: true
解析
const validTicTacToe = function (board) {
let oCount=0,xCount=0;
for(let i=0;i<board.length;i++){
for(let j=0;j<board[i].length;j++){
board[i][j]==="X"&&xCount++
board[i][j]==="O"&&oCount++
}
}
//X和O的个数不相等且X的个数并没与比O多1,则没人获胜
if(xCount!==oCount&&xCount!==oCount+1) return false;
//假如X获胜,但是X的数量并没有比O多1
if(win(board,"X")&&xCount!==oCount+1) return false;
//假如O获胜,但是O的数量与X的数量不相等
if(win(board,"O")&&xCount!==oCount) return false;
return true;
};
function win(board,P){
for(let i=0;i<board.length;i++){
//同一行字符一样
if(board[i][0]===P&&board[i][1]===P&&board[i][2]===P){
return true
}
//同一列字符一样
if(board[0][i]===P&&board[1][i]===P&&board[2][i]===P){
return true
}
}
//对角线的字符是否一样
if(board[0][0]===P&&board[1][1]===P&&board[2][2]===P){
return true
}
if(board[0][2]===P&&board[1][1]===P&&board[2][0]===P){
return true
}
return false
}