LintCode 1022. 合法的井字棋状态 JavaScript算法

描述

一个井字棋盘以字符串数组 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

}

运行结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/SmallTeddy/article/details/108635868