码迷,mamicode.com
首页 > 其他好文 > 详细

31有效的井字游戏(794)

时间:2020-09-17 16:43:44      阅读:31      评论:0      收藏:0      [点我收藏+]

标签:std   提交   dea   http   rem   rip   get   i++   pac   

作者: 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、不符合规则的落点
*/

 

31有效的井字游戏(794)

标签:std   提交   dea   http   rem   rip   get   i++   pac   

原文地址:https://www.cnblogs.com/zmmm/p/13623856.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!