【算法练习】数组

井字游戏

设计一个算法,判断玩家是否赢了井字游戏。输入是一个N x N的数组棋盘,由字符" ""X""O"组成,其中字符" "代表一个空位。

以下是井字游戏的规则:

  • 玩家轮流将字符放入空位(" ")中。
  • 第一个玩家总是放字符"O",且第二个玩家总是放字符"X"
  • "X""O"只允许放置在空位中,不允许对已放有字符的位置进行填充。
  • 当有N个相同(且非空)的字符填充任何行、列或对角线时,游戏结束,对应该字符的玩家获胜。
  • 当所有位置非空时,也算为游戏结束。
  • 如果游戏结束,玩家不允许再放置字符。
  • 如果游戏存在获胜者,就返回该游戏的获胜者使用的字符("X""O");如果游戏以平局结束,则返回"Draw";如果仍会有行动(游戏未结束),则返回"Pending"

示例 1:
输入: board = [“O X”," XO",“X O”]
输出: “X”

示例 2:
输入: board = [“OOX”,“XXO”,“OXO”]
输出: “Draw”
解释: 没有玩家获胜且不存在空位

示例 3:
输入: board = [“OOX”,“XXO”,"OX "]
输出: “Pending”
解释: 没有玩家获胜且仍存在空位

function tictactoe(board){
    var winner = "";
    var hasEmpty = false;
    const N = board[0].length;
    var diagonal = '';
    var diagonal2 = ''
    for(let i=0;i<board.length;i++){//行
        let item = board[i];
        diagonal+=item[i];//主对角线
        diagonal2+=item[N-1-i];//副对角线

        if(item.indexOf(' ')>=0){
            hasEmpty = true;
            continue;
        }
        if(isEqual(item,N)){
            return item[0];
        }
    }
    
    if(isEqual(diagonal,N)){
        return diagonal[0];
    }
    if(isEqual(diagonal2,N)){
        return diagonal2[0];
    }

    const anotherBoard = board.map((item,row) => {
        const newItem = item.split('').map((str,col) => board[col][row]);
        return newItem.join('');
    });

    for(let i=0;i<anotherBoard.length;i++){//列
        let item = anotherBoard[i];
        if(item.indexOf(' ')>=0){
            hasEmpty = true;
            continue;
        }
        if(isEqual(item,N)){
            return item[0];
        }
    }
    if(hasEmpty){
        return "Pending";
    }else{
        return "Draw";
    }
}
function isEqual(item,N){
    if(item[0]===' ') return false;
    if(item.length===1){
        return true;
    }
    var j=0;
    while(item[j]==item[++j] && j<N){                                                   
        if(j==N-1){
            return true;
        }
    }
    return false;
}

var board = ["O X"," XO","X O"];
var res = tictactoe(board);
console.log(res);

用了矩阵转置
主要思路是,先检测 行,然后检测 对角线,最后检测 列。

本练习题来自leetcode。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值