来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-tic-tac-toe-state

题目描述

用字符串数组作为井字游戏的游戏板 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"} 中的一个字符。

解题思路

先说结论,这不是一道好题,像是为了出题而出题,就是为了分类的思想专门出的题

看到题目的时候,我是蒙的,感觉这不是一道算法题,仅仅是一个需求。根据题干可以提取的信息是

1、X的个数永远是等于O或者比O个个数多1

2、有且仅有一个人能够获胜

第一个条件还好,只要统计O和X的个数便可以取得结果。

第二个条件最初的想法是只要三横三竖两斜这八条线最多仅有一个三连就好了,但是我遇到了这么一个列子:

XXX

OOX

OOX

那么是不是横行竖行斜行分别仅可以有一个三连就好了合法了呐?我又遇到了这么一个例子

XXX

XOO

OO

还有这样的例子

OXX

XOX

OXO

直到这个时候,我才意识到我的思路可能出现了偏差,我忽略了一个隐藏的条件,重新提取题干条件如下:

1、X的个数永远是等于O或者比O个个数多1

2、如果X赢,那么X应该比O多1,如果O赢,那么O和X的数目相等

为了检测方便,我首先创建了一个二维int数组,将棋盘的数据存成更好处理的形式,1代表X,0代表空,-1代表了O,顺便在这个过程统计了X和O的个数,判断条件1。下一步,我分别对三横三竖和两斜进行了求和,借助之前取得的X和O的数量信息,判断条件2.

源码展示

class Solution {
public:
bool validTicTacToe(vector<string>& board) {
vector<vector<int>> vviBoard;
vviBoard.resize(3);
for(int i = 0; i < 3; i++)
{
vviBoard[i].resize(3);
}
int iSumX = 0, iSumO = 0;
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 3; j++)
{
if(board[i].at(j) == 'X')
{
vviBoard[i][j] = 1;
iSumX++;
}
else if(board[i].at(j) == 'O')
{
vviBoard[i][j] = -1;
iSumO++;
}
else
{
vviBoard[i][j] = 0;
}
}
}
int iResult = 0;
if(iSumX - iSumO == 0)
{
iResult = -3;
}
else if(iSumX - iSumO == 1)
{
iResult = 3;
}
else
{
return false;
} int aiSum[8] = { 0 };
for(int i = 0; i< 3; i++)
{
for(int j = 0; j< 3; j++)
{
aiSum[i] += vviBoard[i][j];
aiSum[i + 3] += vviBoard[j][i];
}
aiSum[6] += vviBoard[i][i];
aiSum[7] += vviBoard[i][2 - i];
}
for(int i=0; i<8; i++)
{
if(aiSum[i] == -iResult)
return false;
}
return true;
}
};

运行结果

LeetCode-794 有效的井字游戏的更多相关文章

  1. Java实现 LeetCode 794 有效的井字游戏 (暴力分析)

    794. 有效的井字游戏 用字符串数组作为井字游戏的游戏板 board.当且仅当在井字游戏过程中,玩家有可能将字符放置成游戏板所显示的状态时,才返回 true. 该游戏板是一个 3 x 3 数组,由字 ...

  2. [LeetCode] 794. Valid Tic-Tac-Toe State 验证井字棋状态

    A Tic-Tac-Toe board is given as a string array board. Return True if and only if it is possible to r ...

  3. Swift LeetCode 目录 | Catalog

    请点击页面左上角 -> Fork me on Github 或直接访问本项目Github地址:LeetCode Solution by Swift    说明:题目中含有$符号则为付费题目. 如 ...

  4. C#LeetCode刷题-数学

    数学篇 # 题名 刷题 通过率 难度 2 两数相加   29.0% 中等 7 反转整数 C#LeetCode刷题之#7-反转整数(Reverse Integer) 28.6% 简单 8 字符串转整数 ...

  5. C#LeetCode刷题-递归

    递归篇 # 题名 刷题 通过率 难度 687 最长同值路径   30.8% 简单 698 划分为k个相等的子集   30.7% 中等 726 原子的数量   37.2% 困难 761 特殊的二进制序列 ...

  6. 【LeetCode】794. Valid Tic-Tac-Toe State 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/valid-ti ...

  7. LeetCode.接雨水

    题外话:LeetCode上一个测试用例总是通不过(我在文章末贴出通不过的测试用例),给的原因是超出运行时间,我拿那个测试用例试了下2.037ms运行完.我自己强行给加了这句: && m ...

  8. [Swift]LeetCode794. 有效的井字游戏 | Valid Tic-Tac-Toe State

    A Tic-Tac-Toe board is given as a string array board. Return True if and only if it is possible to r ...

  9. [LeetCode] Valid Tic-Tac-Toe State 验证井字棋状态

    A Tic-Tac-Toe board is given as a string array board. Return True if and only if it is possible to r ...

  10. LeetCode All in One题解汇总(持续更新中...)

    突然很想刷刷题,LeetCode是一个不错的选择,忽略了输入输出,更好的突出了算法,省去了不少时间. dalao们发现了任何错误,或是代码无法通过,或是有更好的解法,或是有任何疑问和建议的话,可以在对 ...

随机推荐

  1. 输出图形字符的命令 banner

    输出图形字符的命令 banner 有趣的 Linux 命令.来自实验楼操作系统课程 安装 sudo apt install sysvbanner 截图 其他 还有两个类似的命令toilet,figle ...

  2. Go语言Golang DevOps运维开发实战

    Go语言Golang DevOps运维开发实战 提高运维意识.从下到上,从上到下的工作都要做好,对上运维工作的价值和含金量可以得到认可,对下我们的工作能够提高效率解放运维.运维意识是很重要,并不是你技 ...

  3. mysql数据库(字段约束条件)

    什么是字段约束 字段约束就是将字段的内容定一个规则,我们要按照规则办事 约束 描述 关键字 非空约束 限制该字段的数据不能为null not null 唯一约束 保证该字段的所有数据都是唯一.不重复的 ...

  4. TCPView工具

    TCPView:一个查看端口和线程的小工具.(不需安装) 主界面: 启动程序之后,你就发现TCPView将你目前在使用的所有进程都列举出来了,并时不时的会用红.黄.绿三种颜色标注某些进程: 红色代表该 ...

  5. C#代码扫描工具Sonarqube + Win10+SqlServer2017

    在之前的公司, 看到有用过代码扫描工具, 扫描C#代码, 最近公司也有考虑做这个,于是我便独自研究了一下,这里给大家做个分享 网上找了很多资料, 主要有以下问题: 1. Sonarqube用的是 旧版 ...

  6. python进阶之路12之有参装饰器、多层语法糖、递归函数简介

    多层语法糖 def outter1(func1): print('加载了outter1') def wrapper1(*args, **kwargs): print('执行了wrapper1') re ...

  7. [cocos2d-x]用getContentSize()返回的值用CCLOG打印必须用%f

    今天写代码,又遇到了一个bug,开始还以为是我自己哪写错了,没想到竟然在这里出错? 而width和height的类型是float类型,为什么必须用%d打印?接着我查看了一下源码: 如果没理解错的话,C ...

  8. 一文读懂Go Http Server原理

    hello大家好呀,我是小楼,这是系列文<Go底层原理剖析>的第二篇,依旧是分析 Http 模块,话不多说,开始. 从一个 Demo 入手 俗话说万事开头难,但用 Go 实现一个 Http ...

  9. 梯度下降算法 Gradient Descent

    梯度下降算法 Gradient Descent 梯度下降算法是一种被广泛使用的优化算法.在读论文的时候碰到了一种参数优化问题: 在函数\(F\)中有若干参数是不确定的,已知\(n\)组训练数据,期望找 ...

  10. Ubuntu 22.04 安装搜狗输入法

    下载搜狗输入法 下载地址https://shurufa.sogou.com/linux 也可以命令下载 wget https://ime.sogouimecdn.com/202212182151/3b ...