zoukankan      html  css  js  c++  java
  • 31有效的井字游戏(794)

    作者: Turbo时间限制: 1S章节: 递归

    晚于: 2020-07-29 12:00:00后提交分数乘系数50%

    截止日期: 2020-08-05 12:00:00

    问题描述 :

    用字符串数组作为井字游戏的游戏板 board。当且仅当在井字游戏过程中,玩家有可能将字符放置成游戏板所显示的状态时,才返回 true。

    该游戏板是一个 3 x 3 数组,由字符 " ","X" 和 "O" 组成。字符 " " 代表一个空位。

    以下是井字游戏的规则:

    玩家轮流将字符放入空位(" ")中。

    第一个玩家总是放字符 “X”,且第二个玩家总是放字符 “O”。

    “X” 和 “O” 只允许放置在空位中,不允许对已放有字符的位置进行填充。

    当有 3 个相同(且非空)的字符填充任何行、列或对角线时,游戏结束。

    当所有位置非空时,也算为游戏结束。

    如果游戏结束,玩家不允许再放置字符。

    示例 1:

    输入: board = ["O  ", "   ", "   "]

    输出: false

    解释: 第一个玩家总是放置“X”。

    示例 2:

    输入: board = ["XOX", " X ", "   "]

    输出: false

    解释: 玩家应该是轮流放置的。

    示例 3:

    输入: board = ["XXX", "   ", "OOO"]

    输出: false

    示例 4:

    输入: board = ["XOX", "O O", "XOX"]

    输出: true

    说明:

    游戏板 board 是长度为 3 的字符串数组,其中每个字符串 board[i] 的长度为 3。

     board[i][j] 是集合 {" ", "X", "O"} 中的一个字符。

    可使用以下main函数:

    int main()

    {

        vector<string> board;

        string aRow;

        for(int i=0; i<3; i++)

        {

            getline(cin,aRow);

            board.push_back(aRow);

        }

        bool res=Solution().validTicTacToe(board);

        cout<<(res?"true":"false")<<endl;

        return 0;

    }

    输入说明 :

    输入三行,每行三个字符,每个字符都属于集合 {" ", "X", "O"} 

    输出说明 :

    输出结果:true或false

    输入范例 :

    输出范例 :

    #include <iostream>
    #include <vector> 
    using namespace std;
    
    class Solution {
    public:
        //判断字母a是否赢了
        bool isWin(vector<string>& board, char a) 
        {
            if(board[0][0] == a && board[0][1] == a && board[0][2] == a) return true; 
            if(board[1][0] == a && board[1][1] == a && board[1][2] == a) return true;
            if(board[2][0] == a && board[2][1] == a && board[2][2] == a) return true;
            
            if(board[0][0] == a && board[1][0] == a && board[2][0] == a) return true;
            if(board[0][1] == a && board[1][1] == a && board[2][1] == a) return true;
            if(board[0][2] == a && board[1][2] == a && board[2][2] == a) return true;
            
            if(board[0][0] == a && board[1][1] == a && board[2][2] == a) return true;
            if(board[2][0] == a && board[1][1] == a && board[0][2] == a) return true;
            return false;
        }
        bool validTicTacToe(vector<string>& board) 
        {
            int x = 0, o = 0;   //计数O与X个数
            for(int i = 0; i < 3; i++)
            {
                for(int j = 0; j < 3; j++)
                 {
                    if(board[i][j] == 'X') x++;
                    else if(board[i][j] == 'O') o++;
                }
            }
            if(o > x || x > o + 1) 
                return false;    //个数条件
            bool Owin = isWin(board, 'O'), Xwin = isWin(board, 'X');
            if(Owin && Xwin) return false;  //胜负条件
            if(Xwin && o == x) return false;
            if(Owin && x > o) return false;
            if(!Owin && !Xwin) return true; //没人赢直接true
            char win = Owin ? 'O' : 'X';    //有人赢了要去掉下过的,防止赢一次以后继续下情况
            for(int i = 0; i < 3; i++)
            {
                for(int j = 0; j < 3; j++) 
                {
                    if(board[i][j] == win) 
                    {
                        board[i][j] = ' ';
                        if(validTicTacToe(board)) return true;
                        board[i][j] = win;  //状态恢复
                    }
                }
            }
            return false;
        }
    };
    
    int main()
    {
        vector<string> board;
        string aRow;
        for(int i=0; i<3; i++)
        {
            getline(cin,aRow);
            board.push_back(aRow);
        }
        bool res=Solution().validTicTacToe(board);
        cout<<(res?"true":"false")<<endl;
    
        return 0;
    }
    /*
    作者:c-bee-9F5W7dRrwd
    链接:https://leetcode-cn.com/problems/valid-tic-tac-toe-state/solution/cshuang-100zhen-yao-hui-su-yuan-lai-by-c-bee-9f5w7/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    思路:
    
    由于下棋的规则是X先下,O后下,所以在正常情况下,X>=O。
    
    其实总得来想只有以下几种情况:
    
    1、X赢:X=O+1
    
    2、O赢:X=O
    
    3、平局(九个格子全满):X=O+1
    
    4、正在进行:X=O+1或X=O
    
    5、不符合规则的落点
    */
  • 相关阅读:
    全球疫情实时监控——约翰斯&#183;霍普金斯大学数据大屏实现方案
    少儿编程崛起?2020年4月编程语言排名发布——Java,C,Python分列前三,Scratch挤进前20
    干货来了!阿里发布近300页Flink实战电子书
    Druid 0.17 入门(3)—— 数据接入指南
    Druid 0.17 入门(2)—— 安装与部署
    Flink 1.10 正式发布!——与Blink集成完成,集成Hive,K8S
    Druid入门(1)—— 快速入门实时分析利器-Druid_0.17
    程序员需要了解依赖冲突的原因以及解决方案
    每日一技|活锁,也许你需要了解一下
    Dubbo 服务 IP 注册错误踩坑经历
  • 原文地址:https://www.cnblogs.com/zmmm/p/13623856.html
Copyright © 2011-2022 走看看