《程序员面试金典(第6版)》面试题 16.04. 井字游戏(棋盘类问题,C++)

news2024/7/6 18:50:47

题目描述

设计一个算法,判断玩家是否赢了井字游戏。输入是一个 N x N 的数组棋盘,由字符" ",“X"和"O"组成,其中字符” "代表一个空位。

以下是井字游戏的规则:

玩家轮流将字符放入空位(" “)中。
第一个玩家总是放字符"O”,且第二个玩家总是放字符"X"。
"X"和"O"只允许放置在空位中,不允许对已放有字符的位置进行填充。
当有N个相同(且非空)的字符填充任何行、列或对角线时,游戏结束,对应该字符的玩家获胜。
当所有位置非空时,也算为游戏结束。
如果游戏结束,玩家不允许再放置字符。
如果游戏存在获胜者,就返回该游戏的获胜者使用的字符(“X"或"O”);如果游戏以平局结束,则返回 “Draw”;如果仍会有行动(游戏未结束),则返回 “Pending”。

示例 1:

  • 输入: board = [“O X”," XO",“X O”]
  • 输出: “X”

示例 2:

  • 输入: board = [“OOX”,“XXO”,“OXO”]
  • 输出: “Draw”
  • 解释: 没有玩家获胜且不存在空位

示例 3:

  • 输入: board = [“OOX”,“XXO”,"OX "]
  • 输出: “Pending”
  • 解释: 没有玩家获胜且仍存在空位

提示:

  • 1 <= board.length == board[i].length <= 100
  • 输入一定遵循井字棋规则

解题思路与代码

这道题,我做的时候,属实是高看了它一眼,竟然想要用动态规划的法子一次性去检查横竖斜三个方向去做这道题。果不其然在三小时后遗憾败北。

再一看,这道题尽然无比简单。只需要分别去检查横,竖,斜,就简简单单做出来了。写完代码,加检查可能都不到10分钟。

哎,遗憾遗憾,紧接着,让我来讲讲这道题是怎么做的吧。

方法一 分别检查横,竖,斜三个方向,是否有获胜条件

  • 我们首先需要设置9个int变量。去记录每种棋子横(两种)竖(两种)斜(四种)的个数,还有空位的个数。

  • 用一个双层for循环去遍历这个棋盘,如果找到了符合条件的获胜条件,就直接返回。

具体代码如下:

class Solution {
public:
    string tictactoe(vector<string>& board) {
        int size = board.size(); // 棋盘的大小
        int nullCount = 0; // 空的位置
        int rowO, colO, diagO = 0, antiDiagO = 0;
        int rowX, colX, diagX = 0, antiDiagX = 0;

        for (int i = 0; i < size; ++i) {
            rowO = colO = rowX = colX = 0;
            for (int j = 0; j < size; ++j) {
                if (board[i][j] == 'O') rowO++;
                else if (board[i][j] == 'X') rowX++;
                else nullCount++;

                if (board[j][i] == 'O') colO++;
                else if (board[j][i] == 'X') colX++;
            }

            if (board[i][i] == 'O') diagO++;
            else if (board[i][i] == 'X') diagX++;

            if (board[i][size - 1 - i] == 'O') antiDiagO++;
            else if (board[i][size - 1 - i] == 'X') antiDiagX++;

            if (rowO == size || colO == size || diagO == size || antiDiagO == size) return "O";
            if (rowX == size || colX == size || diagX == size || antiDiagX == size) return "X";
        }

        return nullCount > 0 ? "Pending" : "Draw";
    }
};

在这里插入图片描述

复杂度分析

  • 时间复杂度:O(n^2),因为我们遍历了整个棋盘,需要对每个元素进行检查。

  • 空间复杂度:O(1),我们没有使用额外的数据结构来存储信息,只使用了几个额外的变量来记录行、列和对角线的状态。

总结

最近做八皇后这样的困难题做多了。题一上来可能就有点往复杂的思路上去靠,结果反而得不偿失。

做题还是先想想有没有简单的做法,没有再去往各种算法的思想上去靠。

这道题其实就是朴实无华的一道棋盘问题。

  • 最后的最后,如果你觉得我的这篇文章写的不错的话,请给我一个赞与收藏,关注我,我会继续给大家带来更多更优质的干货内容

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

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

相关文章

专门为麻醉科和手术室开发的:手术麻醉系统源码,系统稳定,功能完整,支持二次开发

手术麻醉系统源码&#xff1a;C# .net 桌面软件 C/S版 系统极其稳定&#xff0c;扩展性强&#xff0c;已在多家医院运营。 文末获取联系 手术麻醉信息管理系统是专门为麻醉科和手术室开发的围手术期临床信息管理系统&#xff0c;具备以下功能: 1.手术程管理系统整合了手术室、…

人工智能实践: 基于T-S 模型的模糊推理

模糊推理是一种基于行为的仿生推理方法, 主要用来解决带有模糊现象的复杂推理问题。由于模糊现象的普遍存在, 模糊推理系统被广泛的应用。模糊推理系统主要由模糊化、模糊规则库、模糊推理方法以及去模糊化组成, 其基本流程如图1所示。

C++(继承下)

目录&#xff1a; 1.继承与有元 2.继承与静态成员 3.单继承、多继承 4.如何定义一个不能被继承的类&#xff1f;&#xff1f; 5.分享有意思的一道题 6.菱形继承及菱形虚拟继承 --------------------------------------------------------------------------------------------…

【c语言】全局变量 | 局部变量的生命周期与作用域

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 给大家跳段街舞感谢支持&#xff01;ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ…

亚马逊云科技赋能客户,为海思科打造安全高效的营销业务中台系统

羽翼渐丰&#xff0c;翱翔云端 携手亚马逊云科技&#xff0c;打造互联网级企业解决方案 秉承“为客户创造价值”的理念&#xff0c;在公司发展过程中&#xff0c;博智信息先后服务了众多知名企业&#xff0c;客户行业覆盖制造、零售、餐饮、科技、电子等。经过近20年的发展&a…

AutoGPT 是 prompt 工程的下一个前沿

前言 最近了解到Auto GPT的上线&#xff0c;下面我来整理一下整个体验过程&#xff0c;希望对大家有所帮助和启发。 首先Auto GPT是 OpenAI 的 Andrej Karpathy 都在大力宣传的一个开源项目&#xff0c;他认为 AutoGPT 是 prompt 工程的下一个前沿。 近日&#xff0c;AI 界貌…

自助式数据分析平台:jvs数据智仓-统计报表的使用条件及界面介绍

统计报表界面介绍 统计报表是指利用表格和报表等形式&#xff0c;将数据以清晰的结构和布局的方式呈现出来&#xff0c;以便用户进行数据分析和决策制定的一种BI统计方法。表格式的BI统计通常采用交叉表格、分组表、报表等形式&#xff0c;对数据进行整合、分析和展示&#xff…

【数据库数据恢复】ndf文件损坏的SQL SERVER数据库数据恢复案例

数据库数据恢复环境&#xff1a; 某公司存储上部署SQL SERVER数据库&#xff0c;数据库中有1000多个文件&#xff0c;该SQL SERVER数据库每10天生成一个NDF文件&#xff0c;数据库包含两个LDF文件。 数据库故障&分析&#xff1a; 存储设备出现故障导致SQL SERVER数据库异常…

IDEA实用设置

1、设置全局编码统一为UTF-8 file>setting中搜索框输入file encoding修改格式为UTF-8 2、设置文字大小 file>setting中搜索框输入font修改字体大小 3、配置maven file>setting中搜索框输入maven修改maven的路径、conf文件、文件仓库 4、idea中实现Serializable提示…

RabbitMQ通讯方式

RabbitMQ通讯方式 RabbitMQ提供了很多中通讯方式&#xff0c;依然可以去官方查看&#xff1a;https://rabbitmq.com/getstarted.html 七种通讯方式 1 RabbitMQ提供的通讯方式 Hello World!&#xff1a;为了入门操作&#xff01;Work queues&#xff1a;一个队列被多个消费者…

三十五、垃圾回收器

一、GC分类于性能指标 垃圾回收器的分类 1.串行回收指的是在同一时间段内只允许有一个CPU用于执行垃圾回收操作&#xff0c;此时工作线程被暂停&#xff0c;直至垃圾收集工作结束。 1)在诸如单CPU处理器或者较小的应用内存等硬件平台不是特别优越的场合&#xff0c;串行回收器…

WRF模式应用:天气预报、模拟分析观测气温、降水、风场、水汽和湿度、土地利用变化、土壤及近地层能量水分通量、土壤、水体、植被等相关气象变量

查看原文>>>高精度气象模拟软件WRF(Weather Research Forecasting)技术及案例应用 目录 区域气候模式理论知识梳理 Linux操作系统WRF模式系统实际操作 模式调试及运行 模式操作及案例实践 实际应用及案例分析 Python在WRF模型自动化运行及前后处理中的实践技术…

为什么在马云成功前就有那么多影像留下来?

马云创业的各个阶段&#xff0c;都有意无意得到媒体的推波助澜&#xff0c;不光是影像&#xff0c;还留下了很多相关的文字报道。站在当时的角度&#xff0c;马云或许并不总是以一种成功人士的身份出现&#xff0c;但即便如此&#xff0c;他做事情也足够新潮、足够前卫、或者足…

Delphi 知识 彻底搞懂Delphi中的匿名方法

前言&#xff1a; 顾名思义&#xff0c;匿名方法是一个没有与之相关的名字的过程或函数。一个匿名方法将一个代码块视为一个实体&#xff0c;可以分配给一个变量或作为一个方法的参数使用。此外&#xff0c;匿名方法可以引用变量&#xff0c;并在定义该方法的上下文中为变量绑定…

Off-CPU分析

前言 性能问题可以分为两种类型&#xff1a; On-CPU&#xff1a;线程花时间在CPU上运行的地方&#xff1b; Off-CPU&#xff1a;在I/O&#xff0c;锁&#xff0c;计数器&#xff0c;分页/交换上阻塞等待的时间 Off-CPU的分析是一种性能分析的方法&#xff0c;用于测量和研究Off…

java懒加载实现

懒加载&#xff0c;也称为“不需要”加载&#xff0c;是一种内存管理方式。在 Java中&#xff0c;当一个类不再使用时&#xff0c;就会将其转化为另一个类对象。这也是所谓的“垃圾回收”。java中的懒加载有三种方式&#xff1a; 3、在对象被回收时&#xff0c;会将其销毁。 在…

DIY可视化必看教程 FLEX组件使用,教大家如何布局界面

DIY可视化必看教程FLEX组件使用 水平布局实现、两端对齐 1、拖个FLEX组件过来&#xff0c;排列方向改为水平。 2、拖个文件内容组件进去、栅格化到0 3、复制多一个文本内容组件 4、修改FLEX组件显示对齐方式 5、图标对齐 6、修改FLEX组件对齐方式 7、修改中间占位大&#xff0…

Windows 11 本地 php环境搭建:PHP + Apache + MySQL 安装和环境配置

目录 前言1. PHP 的下载、安装和配置1.1 下载 php1.2 安装 php1.3 配置 php 系统变量1.4 配置 php.ini 2. Apache 的下载、安装和配置2.1 下载 Apache2.2 安装 Apache2.3 修改配置 Apache2.4 指定服务端口&#xff08;非必须&#xff09;2.5 配置系统变量2.6 安装服务2.7 启动服…

计算机网络闲谈01——QUIC协议

计算机网络闲谈01——QUIC协议 预备知识 重传机制 RTT 一个连接的往返时间 RTO 重传超时时间 RTT和RTO 的关系是&#xff1a;由于网络波动的不确定性&#xff0c;每个RTT都是动态变化的&#xff0c;所以RTO也应随着RTT动态变化。 流量控制 对发送方发送速率的控制 称之为…

【BIM+GIS】BIM模型导入GIS软件之前的一些处理设置

文章目录 一、模型位置发生偏移二、模型对象丢失或增加三、模型材质发生变化四、导出过程缓慢五、模型属性批量丢失一、模型位置发生偏移 在视图→可见性/图形替换模型类别→场地(VV可见性快捷),勾选项目基点。 单击选中项目基点,在属性中修改几点坐标。 即使修改了项目基…