《LeetCode之每日一题》:230.有效的井字游戏

Posted 是七喜呀!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《LeetCode之每日一题》:230.有效的井字游戏相关的知识,希望对你有一定的参考价值。

有效的井字游戏


题目链接: 有效的井字游戏

有关题目

给你一个字符串数组 board 表示井字游戏的棋盘。
当且仅当在井字游戏过程中,棋盘有可能达到 board 所显示的状态时,才返回 true 。

井字游戏的棋盘是一个 3 x 3 数组,由字符 ' ''X''O' 组成。字符 ' ' 代表一个空位。

以下是井字游戏的规则:

	玩家轮流将字符放入空位(' ')中。
	玩家 1 总是放字符 'X' ,而玩家 2 总是放字符 'O''X''O' 只允许放置在空位中,不允许对已放有字符的位置进行填充。
	当有 3 个相同(且非空)的字符填充任何行、列或对角线时,游戏结束。
	当所有位置非空时,也算为游戏结束。
	如果游戏结束,玩家不允许再放置字符。
示例 1:


输入:board = ["O  ","   ","   "]
输出:false
解释:玩家 1 总是放字符 "X"
示例 2:


输入:board = ["XOX"," X ","   "]
输出:false
解释:玩家应该轮流放字符。
示例 3:


输入:board = ["XXX","   ","OOO"]
输出:false
Example 4:


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

board.length == 3
board[i].length == 3
board[i][j]'X''O'' '

题解

法一:分类讨论
参考官方题解

class Solution 
public:
    bool validTicTacToe(vector<string>& board) 
        int xCount = 0, oCount = 0;
        for (auto &row : board)
        
            for (auto &c : row)
            
                if (c == 'X')
                    xCount++;
                
                if (c == 'O')
                    oCount++;
            
        

        //有效的井字游戏满足条件之一为字符 X 的数量要 大于等于字符 O 的数量
        //反之 为假
        if (oCount != xCount && oCount != xCount - 1)
            return false;
        
        //有效的井字游戏满足条件之二为在满足 字符 X 的数量大于等于 字符 O 的数量条件下
        //不满足下列两种情形的状态为 假

        //情形一: 在 字符 X 构成了三个相同字符填充任何行,列或对角线时
        //由于字符 X 先落子,不满足oCount == xCount - 1
        if (win(board, 'X') && oCount != xCount - 1)//注意 字符 X 先落子,所以先判断
            return false;

        //情形二:在 字符 O 构成了三个相同字符填充任何行, 列或对角线时
        //由于字符 O 后落子, 不满足xCount == oCount
        if (win(board, 'O') && oCount != xCount)
            return false;

        //除了上述不满足条件的情形外,其他情况均为有效的井字游戏
        return true;
    


    bool win(vector<string>& board, char c)
    
        for (int i = 0; i < 3; i++)
        
            //判断是否有三个相同字符填充同一行
            if (c == board[i][0] && c == board[i][1] && c == board[i][2])
                return true;
            
            //判断是否有三个相同字符填充同一列
            if (c == board[0][i] && c == board[1][i] && c == board[2][i])
                return true;
        

        //判断是否满足 三个相同字符填充主对角线 和 副对角线情形之一
        if (c == board[0][0] && c == board[1][1] && c == board[2][2])
            return true;
        
        if (c == board[0][2] && c == board[1][1] && c == board[2][0])
            return true;

        return false;
    
;

以上是关于《LeetCode之每日一题》:230.有效的井字游戏的主要内容,如果未能解决你的问题,请参考以下文章

《LeetCode之每日一题》:279.有效的数独

《LeetCode之每日一题》:125.有效的数独

《LeetCode之每日一题》:114.有效三角形的个数

《LeetCode之每日一题》:131.有效的字母异位词

《LeetCode之每日一题》:147.有效的括号字符串

《LeetCode之每日一题》:197.有效的完全平方数