794. 有效的井字游戏(字符串,数组,枚举)

题目描述:

示例 1:
输入: board = ["O  ", "   ", "   "]
输出: false
解释: 第一个玩家总是放置“X”。 

示例 2:
输入: board = ["XOX", " X ", "   "]
输出: false
解释: 玩家应该是轮流放置的。

示例 3:
输入: board = ["XXX", "   ", "OOO"]
输出: false

示例 4:
输入: board = ["XOX", "O O", "XOX"]
输出: true

算法思路:

算法思路简单的将就是枚举出所有返回true的情况,false情况与其想法。

  1. 首先写一个判断某个字符赢的情况的函数,函数参数为board和字符c,赢得情况需要满足垂直方向,竖直方向,对角方向连续三个相连,其他情况返回false。
  2. 在validTicTacToe函数中,首先是遍历board中的'X'和'O'的数量。
  3. 然后处理字符数量不符合的条件(x!=o+1 && x!=o),因为X先出,所以X要么多于O一个,要么和O的数量相同,不满足两者的返回false。
  4. 处理单个字符胜利的情况,当X胜利时,但数量上不满足x==o+1,返回false,当o胜利时,数量上不满足x==o,返回false。
  5. 其他情况返回true。

 代码实现:

class Solution {
public:
    bool validTicTacToe(vector<string>& board) {
        //统计board中的o和x的数量
        int x=0,o=0;
        for(int i=0;i<=2;i++){
            for(int j=0;j<=2;j++){
                if(board[i][j]=='X'){
                    x++;
                }
                if(board[i][j]=='O'){
                    o++;
                }
            }  
        }
        //枚举返回false的情况
        // 排除数量不对的情况
        if(x!=o+1 && x!=o){
            return false;
        }
        // 考虑X或者O获胜,同时满足数量要求,不满足则返回false
        if(win(board,'X')&&x!=o+1){
            return false;
        }
        if(win(board,'O')&&x!=o){
            return false;
        }
        //其他情况返回true。
        return true;
    }
    //判赢函数,传入的参数有游戏板board和赢得字符c
    bool win(vector<string>& board,char c){
        //水平与竖直方向
        for(int i=0;i<=2;i++){
            if(board[i][0]==c&&board[i][1]==c&&board[i][2]==c){
                return true;
            }
            if(board[0][i]==c&&board[1][i]==c&&board[2][i]==c){
                return true;
            }
        }
        //对角线方向
        if(board[0][0]==c&&board[1][1]==c&&board[2][2]==c){
            return true;
        }
        if(board[0][2]==c&&board[1][1]==c&&board[2][0]==c){
            return true;
        }
        //其他情况返回false。
        return false;
    }
};

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值