算法刷题打卡第34天:有效的井字游戏

news2024/9/21 11:15:20

有效的井字游戏

难度:中等

给你一个字符串数组 b o a r d board board 表示井字游戏的棋盘。当且仅当在井字游戏过程中,棋盘有可能达到 b o a r d board board 所显示的状态时,才返回 t r u e true true

井字游戏的棋盘是一个 3 x 3 数组,由字符 ' ''X''O' 组成。字符 ' ' 代表一个空位。

以下是井字游戏的规则:

  • 玩家轮流将字符放入空位(' ')中。
  • 玩家 1 总是放字符 'X' ,而玩家 2 总是放字符 'O'
  • 'X''O' 只允许放置在空位中,不允许对已放有字符的位置进行填充。
  • 当有 3 个相同(且非空)的字符填充任何行、列或对角线时,游戏结束。
  • 当所有位置非空时,也算为游戏结束。
  • 如果游戏结束,玩家不允许再放置字符。

示例 1:

在这里插入图片描述

输入:board = ["O  ","   ","   "]
输出:false
解释:玩家 1 总是放字符 "X" 。

示例 2:

在这里插入图片描述

输入:board = ["XOX"," X ","   "]
输出:false
解释:玩家应该轮流放字符。

示例 3:

在这里插入图片描述

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

分类讨论

思路:
题目要求判断当前游戏板是否生效,我们思考游戏板生效的规则:

  • 玩家轮流将字符放入空位 "   " \texttt{" "} " " 中。第一个玩家总是放字符 "X" \texttt{"X"} "X",且第二个玩家总是放字符 "O" \texttt{"O"} "O"。因为第一个玩家总是先手,这就要求游戏板中字符 "X" \texttt{"X"} "X" 的数量一定是大于等于字符 "O" \texttt{"O"} "O" 的数量。
  • "X" \texttt{"X"} "X" "O" \texttt{"O"} "O" 只允许放置在空位中,不允许对已放有字符的位置进行填充。
  • 当有 3 3 3 个相同(且非空)的字符填充任何行、列或对角线时,游戏结束。当所有位置非空时,也算为游戏结束。如果游戏结束,玩家不允许再放置字符,不可能能出现二者同时获胜的情况,因此游戏板上不可能同时出现 3 3 3 "X" \texttt{"X"} "X" 在一行和 3 3 3 "O" \texttt{"O"} "O" 在另一行。
  • 获胜的玩家一定是在自己放棋后赢得比赛,赢得比赛后,立马停止放置字符。
    • 如果第一个玩家获胜,由于第一个玩家是先手,则次数游戏板中 "X" \texttt{"X"} "X" 的数量比 "O" \texttt{"O"} "O" 的数量多 1 1 1
    • 如果第二个玩家获胜,则 "X" \texttt{"X"} "X" 的数量与 "O" \texttt{"O"} "O" 的数量相同。

以上条件包含了游戏板生效的全部情况,可以通过反证法验证上面分类条件的正确性。在合法的游戏板,只能有 3 3 3 种结果合法,要么没有任何玩家赢,要么玩家一赢,要么玩家二赢。我们可以通过检查两种棋的数量关系即可验证是否有效,同时我们要检测是否存在两个玩家同时赢这种非法情况。

算法实现细节如下:

  • 首先统计游戏板上 "X" \texttt{"X"} "X" "O" \texttt{"O"} "O" 的数量并记录在 xCount \textit{xCount} xCount oCount \textit{oCount} oCount 中,如果不满足 xCount ≥ oCount \textit{xCount} \ge \textit{oCount} xCountoCount,则此时为非法,直接返回 false \texttt{false} false
  • 然后我们检查是否有玩家是否获胜,我们检查在棋盘的 3 3 3 行, 3 3 3 列和 2 2 2 条对角线上是否有该玩家的连续 3 3 3 枚棋子。我们首先检测玩家一是否获胜,如果玩家一获胜,则检查 xCount \textit{xCount} xCount 是否等于 oCount + 1 \textit{oCount} + 1 oCount+1;我们继续检测玩家二是否获胜,如果玩家二获胜,则检查 xCount \textit{xCount} xCount 是否等于 oCount \textit{oCount} oCount
  • 对于特殊情况如果两个玩家都获胜,是否可以检测出该非法情况?如果同时满足两个玩家都获胜,则 "X" \texttt{"X"} "X" "O" \texttt{"O"} "O" 数量的合法的组合可能为 ( 3 , 3 ) , ( 4 , 3 ) , ( 4 , 4 ) , ( 5 , 4 ) (3,3),(4,3),(4,4),(5,4) (3,3),(4,3),(4,4),(5,4),对于 ( 3 , 3 ) , ( 4 , 4 ) (3,3),(4,4) (3,3),(4,4) 不满足玩家一获胜的检测条件,对于 ( 4 , 3 ) , ( 5 , 4 ) (4,3),(5,4) (4,3),(5,4) 满足玩家一获胜的检测条件但不满足玩家二的获胜条件。

时间复杂度: O ( C ) O(C) O(C),由于此题给定的棋盘大小为常数 C = 9 C=9 C=9,因此时间复杂度为常数。
空间复杂度: O ( 1 ) O(1) O(1)

class Solution:
    def win(self, char, board):
        return any(board[0][i] == char and board[1][i] == char and board[2][i] == char or
                   board[i][0] == char and board[i][1] == char and board[i][2] == char for i in range(3)) or \
                   board[0][0] == char and board[1][1] == char and board[2][2] == char or \
                   board[2][0] == char and board[1][1] == char and board[0][2] == char
    def validTicTacToe(self, board: List[str]) -> bool:
        ocount = sum(row.count("O") for row in board)
        xcount = sum(row.count("X") for row in board)
        return not (xcount - ocount not in [0, 1] or
                   xcount - ocount != 0 and self.win('O', board) or
                   xcount - ocount != 1 and self.win('X', board))

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/58171.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MYSQL 中连接的使用

文章目录0 写在前面1 语法说明2 SQL准备3 举例说明3.1 内连接3.2 左连接3.3 右连接4 写在最后0 写在前面 实际业务中,查询数据库大多都是多表链接查询,所以MYSQL的连接的使用非常重要。 连接有三种: INNER JOIN(内连接,或等值连接&#xff0…

[附源码]计算机毕业设计疫情背景下社区互助服务系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

Git基本使用

目录 一、Git基础 1.Git与Github 2.注册Github账号并安装Git 二、Git的使用 1.本地仓库 进行全局配置: 创建仓库: Git常用操作指令: 版本回退: 2.远程仓库 两种常规使用方式: 分支管理: 冲突的产生…

python http模块快速搭建“简单”服务器笔记

极简运行 python -m http.sever或 # test.py import http.server import socketserverPORT 8000Handler http.server.SimpleHTTPRequestHandlerwith socketserver.TCPServer(("", PORT), Handler) as httpd:print("serving at port", PORT)httpd.serve…

m基于matlab的光通信的信道估计,均衡,抑制papr误码率仿真,对比ZF,RLS,MMSE三种算法

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 可见光通信的信道估计,均衡,抑制papr。 不考虑光信道,用传统的无线通信的OFDM的信道估计,均衡,抑制papr 信道估计,均衡最…

解决Windows RDP远程桌面连接同时多用户连接不互踢不干扰问题及rdp wrapper windows版本不受支持问题.

注意: 如果你当前正在通过RDP方式远程连接到你要更改设置的目标计算机,请在目标计算机上安装其他远程控制软件.防止RDP因在此过程中挂掉无法连接. 下载: 使用GitHub - stascorp/rdpwrap: RDP Wrapper Library开源软件 转到Release 最新版本的是1.6.2,原作者没有更新的了.好…

MySQL中count(*)和information_schema.tables中的table_rows值不相同

前两天我还在高高兴兴地写了一篇文章《一条SQL查询出MySQL数据库中所有表的数据量大小》,心想这也太方便了,只用一条SQL就能统计出所有表的数据量,但没想到,最终还是翻车了。。。 翻车过程如下: 有一张表&#xff0c…

【多目标进化优化】 MOEA 测试函数

声明 本文内容来源于 《多目标进化优化》 郑金华 邹娟著,非常感谢两位老师的知识分享,如有侵权,本人立即删除,同时在此表示,本文内容仅学习使用,禁止侵权,谢谢! 注:本文…

HTML+CSS制作简单的家乡网页 ——我的家乡介绍广东 web前端期末大作业

家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法,如盒子的嵌套、浮动、margin、border、background等属性的使用,外部大盒子设定居中,内部左中右布局,下方横向浮动排列,大学学习的前端知识点和布局方式都有…

基于STM32单片机的温度报警器(数码管)(Proteus仿真+程序)

编号:26 基于STM32单片机的温度报警器(数码管) 功能描述: 本设计由STM32F103单片机最小系统DS18B20温度传感器数码管显示模块声光报警模块独立按键组成。 1、主控制器是STM32F103单片机 2、DS18B20温度传感器测量温度 3、数码管显示温度值&…

数字化改革“1612”详解

背景 2021年2月18日,浙江省开始数字化改革建设,通过一年的建设,取得了光辉成绩。2022年2月28日,在省数字化改革推进大会,回顾一年来数字化改革的主要成效,研究部署2022年数字化改革目标任务,在…

Spring框架(六):SpringTransaction事务的底层原理、xml配置和注解配置

SpringTransaction事务的底层原理、xml配置和注解配置引子Spring事务入门搭建Test环境基于XML的方式配置事务Spring事务的隔离级别Spring事务的传播行为通过Annotation方式配置Spring的事务引子 痛定思痛,主要问题出现在自己雀氏不熟悉框架底层、一些面试题&#x…

【源码分析】Springboot启动流程源码分析

1.简介 springboot版本:2.7.2 SpringApplication类是用来执行Spring框架启动的引导类。 有两种方式可以进行启动引导: 通过静态方法SpringApplication.run启动。先创建SpringApplication实例,在调用的实例方法run进行启动。 无论是以上哪种…

资源管理管理

资源管理目录概述需求:设计思路实现思路分析1.PMI hr的理念2.双因素的理论3.马斯洛的需求层析理论4.延伸5.X,Y理论Z 理论期望理论:亚当斯公共理论边际福利,光环效应,额外待遇,皮的原理,KISS原理…

阿里P9大牛带你在简历上写精通Spring与Boot高级功能

前言 蓦然回首自己做开发已经十年了,这十年中我获得了很多,技术能力、培训、出国、大公司的经历,还有很多很好的朋友。但再仔细一想,这十年中我至少浪费了五年时间,这五年可以足够让自己成长为一个优秀的程序员&#…

QT - 模型与视图

经典MVC模式中,M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。其中,View的定义比较清晰,就是用户界面。 MVC 不是一…

银行 测试|测试开发 面试真题|面经 汇总

招银测开面经 一面 1.面向对象3大特征 2.java是否能多继承,怎么实现多继承 3.抽象类 4.数据库特性,隔离级别 5.sql语句查找 6.static关键字的使用 7.手撕:寻找字符串出现频率最高的字符 8.代码改进和测试 二面 1.先闲聊了几句&…

Python面向对象编程

本篇内容: 1、反射  2、面向对象编程  3、面向对象三大特性  4、类成员  5、类成员修饰符  6、类的特殊成员  7、单例模式 反射 python中的反射功能是由以下四个内置函数提供:hasattr、getattr、setattr、delattr,改四个函数分别用于对对象…

m基于GA遗传算法的高载能负荷响应优化控制模型matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 高载能企业执行子站接收负荷调整指令后,需将有功功率、无功功率调整总量合理分配给各用能设备/系统。研究高载能负荷响应优化控制模型,建立以高载能企业响应效益最优为目标…

ccf序列查询新解python满分_纯数学规律(学霸怎么想到的啊......)

题目 思路和代码 这题我也就看了好几个小时吧。终于!有点懂了! 上午看懂了用双指针写《下一个排序》后就在看这题。70分的代码很好写也很好想,就是模拟fx和gx,然后遍历一趟,得到最终的结果。 看了学霸的代码&#x…