来源:力扣(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. 2022-6.824-Lab1:Map&Reduce

    lab 地址 : https://pdos.csail.mit.edu/6.824/labs/lab-mr.html 1. 介绍 准备工作 阅读 MapReduce 做什么 实现一个分布式的 Map ...

  2. 学习ASP.NET Core Blazor编程系列十七——文件上传(上)

    学习ASP.NET Core Blazor编程系列文章之目录 学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应 ...

  3. Vue 响应式原理模拟以及最小版本的 Vue的模拟

    在模拟最小的vue之前,先复习一下,发布订阅模式和观察者模式 对两种模式有了了解之后,对Vue2.0和Vue3.0的数据响应式核心原理 1.Vue2.0和Vue3.0的数据响应式核心原理 (1).  ...

  4. .NET周报【12月第2期 2022-12-15】

    国内文章 九哥聊Kestrel网络编程第一章:开发一个Redis服务器 https://mp.weixin.qq.com/s/HJYnBE-7wbvkAYHxQaq3eQ 我和拥有多个.NET 千星开 ...

  5. vue 项目引入 echarts折线图

    一.components文件下新建 lineCharts.vue <template> <div :class="className" :style=" ...

  6. C++进阶(哈希)

    vector容器补充(下面会用到) 我们都知道vector容器不同于数组,能够进行动态扩容,其底层原理:所谓动态扩容,并不是在原空间之后接续新空间,因为无法保证原空间之后尚有可配置的空间.而是以原大小 ...

  7. 使用python批量更改文件

    最近整理之前学爬虫存储的文件,发现有很多文件名有重复,而我有一点点强迫症,不想文件名重复,就写了一个Python代码来解决文件名重复问题 import os import random import ...

  8. [0x12] 132.小组队列

    题意 link(more:UVA540) 简化题意:对 \(n\) 个小组排队,每个小组有至多 \(m\) 个成员(每个成员有唯一编号 \(x\)),当一个人来到队伍时,如果队中有同组成员,直接插入其 ...

  9. 【转载】SQL SERVER 中单字节和双字节互转自定义函数(全角半角转换)

    一.首先创建一个自定义函数,代码如下: alter function f_convert( @str nvarchar(4000), --要转换的字符串 @flag bit --转换标志,0转换成半角 ...

  10. Kali-Linux-for-Docker

    说明 基于kali官方开源的Docker镜像修改,如需使用官方固件可以前往https://hub.docker.com/r/kalilinux/kali-rolling Docker Hub http ...