LeetCode-794 有效的井字游戏
来源:力扣(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 有效的井字游戏的更多相关文章
- Java实现 LeetCode 794 有效的井字游戏 (暴力分析)
794. 有效的井字游戏 用字符串数组作为井字游戏的游戏板 board.当且仅当在井字游戏过程中,玩家有可能将字符放置成游戏板所显示的状态时,才返回 true. 该游戏板是一个 3 x 3 数组,由字 ...
- [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 ...
- Swift LeetCode 目录 | Catalog
请点击页面左上角 -> Fork me on Github 或直接访问本项目Github地址:LeetCode Solution by Swift 说明:题目中含有$符号则为付费题目. 如 ...
- C#LeetCode刷题-数学
数学篇 # 题名 刷题 通过率 难度 2 两数相加 29.0% 中等 7 反转整数 C#LeetCode刷题之#7-反转整数(Reverse Integer) 28.6% 简单 8 字符串转整数 ...
- C#LeetCode刷题-递归
递归篇 # 题名 刷题 通过率 难度 687 最长同值路径 30.8% 简单 698 划分为k个相等的子集 30.7% 中等 726 原子的数量 37.2% 困难 761 特殊的二进制序列 ...
- 【LeetCode】794. Valid Tic-Tac-Toe State 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/valid-ti ...
- LeetCode.接雨水
题外话:LeetCode上一个测试用例总是通不过(我在文章末贴出通不过的测试用例),给的原因是超出运行时间,我拿那个测试用例试了下2.037ms运行完.我自己强行给加了这句: && m ...
- [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 ...
- [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 ...
- LeetCode All in One题解汇总(持续更新中...)
突然很想刷刷题,LeetCode是一个不错的选择,忽略了输入输出,更好的突出了算法,省去了不少时间. dalao们发现了任何错误,或是代码无法通过,或是有更好的解法,或是有任何疑问和建议的话,可以在对 ...
随机推荐
- js迭代循环
一.for loop for (let i = 0; i < products.length; i++) { console.log(products[i]); } 支持循环中断,可以用brea ...
- JavaScript:如何知道一个变量的数据类型?:typeof
使用typeof去查看一个变量的数据类型,如下图所示,展示了JS的七大基础数据类型和对象: 这里有必要提一下: 函数也是一个对象,但是函数的特殊性,使得在使用typeof去判断其类型的时候,会输出fu ...
- 一、对称加密(DES加密)
一.DES简介DES是一种对称加密(Data Encryption Standard)算法.于1977年得到美国政府的正式许可,是一种用56位密钥来加密64位数据的方法.一般密码长度为8个字节,其中5 ...
- 详解kubernetes五种暴露服务的方式
部署完服务终将是为了访问,那么kubernetes中service和ingress都可以将集群内部的服务能够支持外部访问.service可以让一组 Pod(称为"后端")为集群内的 ...
- ArcGIS工具 - 统计要素数量
查询和统计是GIS中的重要功能之一.在ArcGIS中可以按属性信息.按空间位置关系进行查询和统计.今天为源GIS给大家分享使用ArcPy编程实现批量统计地理数据库要素类记录数量. 软件应用 统计单个图 ...
- python之路25 面向对象 封装(隐藏、伪装)、多态、反射
派生方法实战演练 import json import datetime d = { 't1': datetime.date.today(), 't2': datetime.datetime.toda ...
- Java基础篇——集合框架
集合--对象的容器 集合与数组相似,不同的是,集合的长度可变并且只能组合引用类型数据,如果要组合基本类型,则需要装箱成包装类 Collection体系集合 Collection父接口 Collecti ...
- P8701 [蓝桥杯 2019 国 B] 第八大奇迹
简要题意 你需要维护一个长度为 \(L\) 的序列 \(a\),初始时全部都是 \(0\),有 \(N\) 个操作,支持: C p x,将 \(a_p\) 修改为 \(x\). Q a b,输出 \( ...
- angular建立服务打印日志创建全局变量方法有两种,手工创建,依赖注入
- python paramiko通过远程操作linux
python-paramiko通过远程操作linux 1. python-paramiko通过远程操作linux python3 远程操作linux 使用第三方paramiko库,对于实现运维自动部署 ...