Leetcode--Java--794. 有效的井字游戏

2023-12-02 18:58

本文主要是介绍Leetcode--Java--794. 有效的井字游戏,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述

用字符串数组作为井字游戏的游戏板 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

思路

模拟 + 分类讨论

  1. 某时刻x的数量要么和o相等,要么大于o
  2. 同时要记录x有没有赢,o有没有赢,不可能同时赢。
  3. 判断x赢后,x的个数一定比o多一吗,因为最后一步是x。反过来,如果是o赢了,那么x和o的个数一定相等。
    在这里插入图片描述
  4. 先写统计字符个数的函数,然后依次判断第i行,i列,对角线以及反对角线
  5. 分类四种不可能情况,双赢,x赢但多的个数大于1,o赢但个数不等于x,没人赢但棋局出现x个数比o大的多1,或者x不等于0。

代码

class Solution {String[] board;public int get(char c) {int res = 0;for (int i = 0; i < board.length; i ++ ) {for (int j = 0; j < board[i].length(); j ++ ) {if (c == board[i].charAt(j)) {res ++;}}}return res;}//判断局面,也就是是否存在某行某列某对角等于cpublic boolean check(char c) {//先判断行和列for (int i = 0; i < 3; i ++ ) {if (board[i].charAt(0) == c && board[i].charAt(1) == c && board[i].charAt(2) == c) return true;if (board[0].charAt(i) == c && board[1].charAt(i) == c && board[2].charAt(i) == c) return true;}//正、反对角线if (board[0].charAt(0) == c && board[1].charAt(1) == c && board[2].charAt(2) == c) return true;if (board[0].charAt(2) == c && board[1].charAt(1) == c && board[2].charAt(0) == c) return true;return false;}public boolean validTicTacToe(String[] _board) {board = _board;int cntX = get('X'), cntO = get('O');boolean bX = check('X'), bO = check('O');//同时赢,显然不可能if (bX && bO) return false;//x赢,如果不是恰好多一个if (bX && cntX != cntO + 1) return false;//o赢,如果不是恰好等于xif (bO && cntO != cntX) return false;//如果数量不是X等于O或者x比O多一,那就不可能if (!(cntO == cntX || cntX == cntO + 1)) return false;return true; }
}

这篇关于Leetcode--Java--794. 有效的井字游戏的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/446430

相关文章

javax.net.ssl.SSLHandshakeException:异常原因及解决方案

《javax.net.ssl.SSLHandshakeException:异常原因及解决方案》javax.net.ssl.SSLHandshakeException是一个SSL握手异常,通常在建立SS... 目录报错原因在程序中绕过服务器的安全验证注意点最后多说一句报错原因一般出现这种问题是因为目标服务器

Java实现删除文件中的指定内容

《Java实现删除文件中的指定内容》在日常开发中,经常需要对文本文件进行批量处理,其中,删除文件中指定内容是最常见的需求之一,下面我们就来看看如何使用java实现删除文件中的指定内容吧... 目录1. 项目背景详细介绍2. 项目需求详细介绍2.1 功能需求2.2 非功能需求3. 相关技术详细介绍3.1 Ja

springboot项目中整合高德地图的实践

《springboot项目中整合高德地图的实践》:本文主要介绍springboot项目中整合高德地图的实践,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一:高德开放平台的使用二:创建数据库(我是用的是mysql)三:Springboot所需的依赖(根据你的需求再

spring中的ImportSelector接口示例详解

《spring中的ImportSelector接口示例详解》Spring的ImportSelector接口用于动态选择配置类,实现条件化和模块化配置,关键方法selectImports根据注解信息返回... 目录一、核心作用二、关键方法三、扩展功能四、使用示例五、工作原理六、应用场景七、自定义实现Impor

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

SpringBoot整合Flowable实现工作流的详细流程

《SpringBoot整合Flowable实现工作流的详细流程》Flowable是一个使用Java编写的轻量级业务流程引擎,Flowable流程引擎可用于部署BPMN2.0流程定义,创建这些流程定义的... 目录1、流程引擎介绍2、创建项目3、画流程图4、开发接口4.1 Java 类梳理4.2 查看流程图4

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

Java对异常的认识与异常的处理小结

《Java对异常的认识与异常的处理小结》Java程序在运行时可能出现的错误或非正常情况称为异常,下面给大家介绍Java对异常的认识与异常的处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参... 目录一、认识异常与异常类型。二、异常的处理三、总结 一、认识异常与异常类型。(1)简单定义-什么是

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关