井字游戏00

news/2024/7/19 1:33:44 标签: 算法, leetcode, java, 数据结构

题目链接

井字游戏

题目描述


注意点

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

解答思路

  • 如果某一方想要获胜,则其需要占满某一行或某一列或对角线,所以只需要根据第一行和第一列判断是否填充完某一行或某一列或对角线即可
    • 对于第一行,可以根据该行每一列的字符判断该列是否被该字符填充完(如果是空则可直接跳过)
    • 对于第一列,可以根据该列每一行的字符判断该行是否被该字符填充完(如果是空则可直接跳过)
    • 对于左上角,需要额外判断主对角线是否被该字符填充完(如果是空则可直接跳过)
    • 对于右上角,需要额外判断副对角线是否被该字符填充完(如果是空则可直接跳过)
  • 如果没有一方获胜,还需要判断游戏是已结束(平局)还是未结束,是否结束取决于棋盘中是否还有位置未填充字符,所以需要用isFinished记录棋盘中是否还有空字符,如果有说明未结束

代码

java">class Solution {
    int n;
    boolean isFinished;
    public String tictactoe(String[] board) {
        isFinished = true;
        n = board.length;
        // 判断字符是否填充完某一行
        for (int row = 0; row < n; row++) {
            if (board[row].charAt(0) == ' ') {
                isFinished = false;
            } else {
                char c = board[row].charAt(0);
                if (isRow(row, c, board)) {
                    return String.valueOf(c);
                }
            }
        }
        // 判断字符是否填充完某一列
        for (int col = 0; col < n; col++) {
            if (board[0].charAt(col) == ' ') {
                isFinished = false;
            } else {
                char c = board[0].charAt(col);
                if (isCol(col, c, board)) {
                    return String.valueOf(c);
                }
            }
        }
        // 左上角的点判断是否满足主对角线
        if (board[0].charAt(0) == ' ') {
            isFinished = false;
        } else {
            char c = board[0].charAt(0);
            if (isMain(c, board)) {
                return String.valueOf(c);
            }
        }
        // 右上角的点判断是否满足副对角线
        if (board[0].charAt(n - 1) == ' ') {
            isFinished = false;
        } else {
            char c = board[0].charAt(n - 1);
            if (isSub(c, board)) {
                return String.valueOf(c);
            }
        }
        return isFinished ? "Draw" : "Pending";
    }

    public boolean isRow(int row, char c, String[] board) {
        for (int col = 0; col < n; col++) {
            if (board[row].charAt(col) == c) {
                continue;
            }
            if (board[row].charAt(col) == ' ') {
                isFinished = false;
            }
            return false;
        }
        return true;
    }

    public boolean isCol(int col, char c, String[] board) {
        for (int row = 0; row < n; row++) {
            if (board[row].charAt(col) == c) {
                continue;
            }
            if (board[row].charAt(col) == ' ') {
                isFinished = false;
            }
            return false;
        }
        return true;
    }

    public boolean isMain(char c, String[] board) {
        for (int i = 0; i < n; i++) {
            if (board[i].charAt(i) == c) {
                continue;
            }
            if (board[i].charAt(i) == ' ') {
                isFinished = false;
            }
            return false;
        }
        return true;
    }

    public boolean isSub(char c, String[] board) {
        for (int i = 0; i < n; i++) {
            if (board[i].charAt(n - i - 1) == c) {
                continue;
            }
            if (board[i].charAt(n - i - 1) == ' ') {
                isFinished = false;
            }
            return false;
        }
        return true;
    }
}

关键点

  • 井字棋取胜的规律
  • 注意边界问题

http://www.niftyadmin.cn/n/5548431.html

相关文章

白骑士的C++教学基础篇 1.4 函数

系列目录 上一篇&#xff1a;白骑士的C教学基础篇 1.3 控制流 函数是编程中的基本构建块之一&#xff0c;它允许我们将代码组织成逻辑单元&#xff0c;提高代码的可读性和可维护性。C中的函数提供了丰富的功能&#xff0c;包括函数定义与调用、函数参数与返回值、函数重载和内…

获取商铺信息,以及商铺信息的增删改查

本文章主要讲述如何对商铺信息进行基本的增删改查操作&#xff0c;及数据库对比。 1、获取首页仪表盘统计数据接口 待收费金额&#xff1a; SELECT count(1) as count,IFNULL(sum(total),0)as sum FROM payment_bill WHERE enabled_mark 1 AND pay_state0 欠费数据&#xf…

ArkUI开发学习随机——B站视频简介页面,美团购买界面

案例一&#xff1a;B站视频简介页面 代码&#xff1a; build() {Column(){Column(){Stack(){Image($r("app.media.genimpact")).width(200).height(125).borderRadius({topLeft:5,topRight:5})Row(){Image($r("app.media.bz_play")).height(24).fillColor…

C#中,不同命名空间下面完全相同的类对象进行赋值

背景前提&#xff1a; 1、在命名空间ModelA、ModelB下&#xff0c;都有完全相同的类定义ClassX、ClassY、ClassZ &#xff1b; 2、ClassBase是父类&#xff0c;它的子类有&#xff1a;ClassX、ClassY、ClassZ 3、在ModelB下不能访问ModelA&#xff1b; 4、有大量文件&…

黑客出售 2024 年脸书个人资料数据

最近&#xff0c;一个地下论坛上的威胁行为者发布了涉嫌数据泄露的消息。 该事件涉及脸书用户的大型数据库被泄露。 泄露的数据包括敏感的用户信息&#xff0c;例如全名、个人资料、电子邮件、电话号码、出生日期和位置。 需要注意的是&#xff0c;这些信息来自网络犯罪分子…

数一140+上岸|七月强化一定要避开这3个雷区!

当然可以&#xff0c;强化阶段的主要任务就是做题&#xff01; 但是不用一刀切&#xff0c;强化阶段听课和做题可以二八原则&#xff0c;就是听课占20%&#xff0c;做题占80%。 因为自己去自学讲义的话&#xff0c;比如张宇18讲&#xff0c;会漏掉一些重点&#xff0c;有的技…

视频解码故障案例两则

案例1 绿边 故障分析&#xff1a; 这个能明显看到视频上方出现绿色半透明边带。这说明Y数据正常。UV数据不正常。 它显然与视频帧的垂直分辨率设置有关。 UV数据和Y数据是连续放置的&#xff0c;如果上方出现彩色数据失调&#xff0c;说明这部分数据实际仍然是Y数据。也就是…

react 的条件渲染

##### 使用 if/else 语句 可以在 JSX 中使用普通的 JavaScript if/else 语句来进行条件渲染。 import React from react; function ConditionalRender(props) {const isLoggedIn props.isLoggedIn;if (isLoggedIn) {return <UserGreeting />;} else {return <Guest…