井字游戏 (求和计数法)

题目:

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

以下是井字游戏的规则:

  • 玩家轮流将字符放入空位(" ")中。
  • 第一个玩家总是放字符"O",且第二个玩家总是放字符"X"。
  • "X"和"O"只允许放置在空位中,不允许对已放有字符的位置进行填充。
  • 当有N个相同(且非空)的字符填充任何行、列或对角线时,游戏结束,对应该字符的玩家获胜。
  • 当所有位置非空时,也算为游戏结束。
  • 如果游戏结束,玩家不允许再放置字符。

如果游戏存在获胜者,就返回该游戏的获胜者使用的字符("X"或"O");如果游戏以平局结束,则返回 "Draw";如果仍会有行动(游戏未结束),则返回 "Pending"。

示例:

输入: board = ["O X"," XO","X O"]
输出: "X"

输入: board = ["OOX","XXO","OXO"]
输出: "Draw"
解释: 没有玩家获胜且不存在空位
输入: board = ["OOX","XXO","OX "]
输出: "Pending"
解释: 没有玩家获胜且仍存在空位

解题思路:

1.对每行、每列、左对角线、右对角线上的字符进行求和

2.如果当前行满足游戏胜利的规则,则说明当前那一方胜利

3.否则,根据在遍历时判断的是否存在空位来判断,返回"Draw"或者"Pending"

Code:

class Solution {
public:
    string tictactoe(vector<string>& board) {
        int n=board.size();
        int N=n;
        int row=0,col=0,left=0,right=0;
        int isfull=1;
        for(int i=0;i<n;i++)
        {
            //行和列,可以分为三行三列,所以要在每次开启新的行和列时,要对当前行和列的总和清空
            row=0,col=0;
            //因而对角线就只有两条,只用累加n次
            left+=board[i][i];//左上角的对角线进行求和
            right+=board[i][n-1-i];//右上角的对角线进行求和
            //计算当前行和列
            for(int j=0;j<n;j++)
            {
                row+=board[i][j];
                col+=board[j][i];
                //遇到空位就将isfull置为0,为后续判断做准备
                if(board[i][j]==' ') isfull=0;
            }
            //当前行、列和对角线符合有N个X,那么说明X方胜利
            if(row==((int)'X')*N || col==((int)'X')*N ||left==((int)'X')*N || right==((int)'X')*N)
            {
                return string("X");
            }
            //O同理
            if(row==((int)'O')*N || col==((int)'O')*N ||left==((int)'O')*N || right==((int)'O')*N)
            {
                return string("O");
            }
        }
        //没有人胜利,判断是否有空位
        //没有空位,返回draw
        if(isfull)
                return string("Draw");
        //有,则返回pending
        else
        {
            return string("Pending");
        }
    }
};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值