1222.可以攻击国王的皇后

news2024/11/20 3:36:10

在一个 8x8 的棋盘上,放置着若干「黑皇后」和一个「白国王」。

给定一个由整数坐标组成的数组 queens ,表示黑皇后的位置;以及一对坐标 king ,表示白国王的位置,返回所有可以攻击国王的皇后的坐标(任意顺序)。

示例 1:

输入:queens = [[0,1],[1,0],[4,0],[0,4],[3,3],[2,4]], king = [0,0]
输出:[[0,1],[1,0],[3,3]]
解释: 
[0,1] 的皇后可以攻击到国王,因为他们在同一行上。 
[1,0] 的皇后可以攻击到国王,因为他们在同一列上。 
[3,3] 的皇后可以攻击到国王,因为他们在同一条对角线上。 
[0,4] 的皇后无法攻击到国王,因为她被位于 [0,1] 的皇后挡住了。 
[4,0] 的皇后无法攻击到国王,因为她被位于 [1,0] 的皇后挡住了。 
[2,4] 的皇后无法攻击到国王,因为她和国王不在同一行/列/对角线上。

示例 2:

输入:queens = [[0,0],[1,1],[2,2],[3,4],[3,5],[4,4],[4,5]], king = [3,3]
输出:[[2,2],[3,4],[4,4]]

示例 3:

输入:queens = [[5,6],[7,7],[2,1],[0,7],[1,6],[5,1],[3,7],[0,3],[4,0],[1,2],[6,3],[5,0],[0,4],[2,2],[1,1],[6,4],[5,4],[0,0],[2,6],[4,5],[5,2],[1,4],[7,5],[2,3],[0,5],[4,2],[1,0],[2,7],[0,1],[4,6],[6,1],[0,6],[4,3],[1,7]], king = [3,4]
输出:[[2,3],[1,4],[1,6],[3,7],[4,3],[5,4],[4,5]]

提示:

  • 1 <= queens.length <= 63
  • queens[i].length == 2
  • 0 <= queens[i][j] < 8
  • king.length == 2
  • 0 <= king[0], king[1] < 8
  • 一个棋盘格上最多只能放置一枚棋子。

题目链接

核心做法:以国王为中心,分别向八个方向探索皇后的存在,在某个方向碰到皇后之后就换下一个方向找皇后(在一个方向找皇后的时候要注意不要越界),然后将找到的皇后的坐标存储到一个二维数组里面

int kx = king[0];
    int ky = king[1];
    int n = 8;
    int arr[8][8] = {0};  // 记录皇后的位置

    for (int i = 0; i < queensSize; i++) {
        arr[queens[i][0]][queens[i][1]] = 1; // 标记
    }

    int rx = 0; // 返回的二维数组的下标

创建一个二维数组用于标记皇后的位置,皇后在的位置值就为1,这个二维数组后续用于在一个方向上找皇后

// 创建一个动态分配的二维数组来存储结果
    int** result = (int**)malloc(queensSize * sizeof(int*));
    for (int i = 0; i < queensSize; i++) {
        result[i] = (int*)malloc(2 * sizeof(int));
    }

用于存储能够打到国王的皇后

 // 横坐标相等(左边)
    for (int j = ky - 1; j >= 0; j--) {
        if (arr[kx][j] == 1) {
            result[rx][0] = kx;
            result[rx][1] = j;
            rx++;
            break;
        }
    }

    // 横坐标相等(右边)
    for (int j = ky + 1; j < 8; j++) {
        if (arr[kx][j] == 1) {
            result[rx][0] = kx;
            result[rx][1] = j;
            rx++;
            break;
        }
    }

    // 纵坐标相等(上面)
    for (int i = kx - 1; i >= 0; i--) {
        if (arr[i][ky] == 1) {
            result[rx][0] = i;
            result[rx][1] = ky;
            rx++;
            break;
        }
    }

    // 纵坐标相同(下面)
    for (int i = kx + 1; i < 8; i++) {
        if (arr[i][ky] == 1) {
            result[rx][0] = i;
            result[rx][1] = ky;
            rx++;
            break;
        }
    }

在相同的横纵方向上找离国王最近的皇后

// 左上方
    int num1 = 1;
    while(kx-num1>=0 && ky-num1>=0){
        if(arr[kx-num1][ky-num1]==1){
            result[rx][0] = kx-num1;
            result[rx][1] = ky-num1;
            rx++;
            break;
        }
        num1++;
    }

    // 右下方
    int num = 1;
    while (kx + num < 8 && ky + num < 8) {
        if (arr[kx + num][ky + num] == 1) {
            result[rx][0] = kx + num;
            result[rx][1] = ky + num;
            rx++;
            break;
        }
        num++;
    }

    // 右上方
    int num2 = 1;
    while (kx - num2 >= 0 && ky + num2 < 8) {
        if (arr[kx - num2][ky + num2] == 1) {
            result[rx][0] = kx - num2;
            result[rx][1] = ky + num2;
            rx++;
            break;
        }
        num2++;
    }

    // 左下方
    int num3 = 1;
    while (kx + num3 < 8 && ky - num3 >= 0) {
        if (arr[kx + num3][ky - num3] == 1) {
            result[rx][0] = kx + num3;
            result[rx][1] = ky - num3;
            rx++;
            break;
        }
        num3++;
    }

再找斜线上的皇后的时候要注意不要越界,所以我在循环的判断语句中保证向斜对角线探索的坐标不会超过界限,然后在这个方向上找皇后的位置,如果找到的就把坐标存到之前动态分配的二维数组里面去,否则继续往下找,直到边界

 // 设置返回的数组大小
    *returnSize = rx;

    // 分配列大小数组的内存
    *returnColumnSizes = (int*)malloc(rx * sizeof(int));

    for (int i = 0; i < rx; i++) {
        (*returnColumnSizes)[i] = 2; // 每行有两列
    }

    return result; // 返回结果数组

将得到的数值赋给相应的变量

完整代码

int** queensAttacktheKing(int** queens, int queensSize, int* queensColSize, int* king, int kingSize, int* returnSize, int** returnColumnSizes) {
    int kx = king[0];
    int ky = king[1];
    int n = 8;
    int arr[8][8] = {0};  // 记录皇后的位置

    for (int i = 0; i < queensSize; i++) {
        arr[queens[i][0]][queens[i][1]] = 1; // 标记
    }

    int rx = 0; // 返回的二维数组的下标

    // 创建一个动态分配的二维数组来存储结果
    int** result = (int**)malloc(queensSize * sizeof(int*));
    for (int i = 0; i < queensSize; i++) {
        result[i] = (int*)malloc(2 * sizeof(int));
    }

    // 横坐标相等(左边)
    for (int j = ky - 1; j >= 0; j--) {
        if (arr[kx][j] == 1) {
            result[rx][0] = kx;
            result[rx][1] = j;
            rx++;
            break;
        }
    }

    // 横坐标相等(右边)
    for (int j = ky + 1; j < 8; j++) {
        if (arr[kx][j] == 1) {
            result[rx][0] = kx;
            result[rx][1] = j;
            rx++;
            break;
        }
    }

    // 纵坐标相等(上面)
    for (int i = kx - 1; i >= 0; i--) {
        if (arr[i][ky] == 1) {
            result[rx][0] = i;
            result[rx][1] = ky;
            rx++;
            break;
        }
    }

    // 纵坐标相同(下面)
    for (int i = kx + 1; i < 8; i++) {
        if (arr[i][ky] == 1) {
            result[rx][0] = i;
            result[rx][1] = ky;
            rx++;
            break;
        }
    }

    // 左上方
    int num1 = 1;
    while(kx-num1>=0 && ky-num1>=0){
        if(arr[kx-num1][ky-num1]==1){
            result[rx][0] = kx-num1;
            result[rx][1] = ky-num1;
            rx++;
            break;
        }
        num1++;
    }

    // 右下方
    int num = 1;
    while (kx + num < 8 && ky + num < 8) {
        if (arr[kx + num][ky + num] == 1) {
            result[rx][0] = kx + num;
            result[rx][1] = ky + num;
            rx++;
            break;
        }
        num++;
    }

    // 右上方
    int num2 = 1;
    while (kx - num2 >= 0 && ky + num2 < 8) {
        if (arr[kx - num2][ky + num2] == 1) {
            result[rx][0] = kx - num2;
            result[rx][1] = ky + num2;
            rx++;
            break;
        }
        num2++;
    }

    // 左下方
    int num3 = 1;
    while (kx + num3 < 8 && ky - num3 >= 0) {
        if (arr[kx + num3][ky - num3] == 1) {
            result[rx][0] = kx + num3;
            result[rx][1] = ky - num3;
            rx++;
            break;
        }
        num3++;
    }

    // 设置返回的数组大小
    *returnSize = rx;

    // 分配列大小数组的内存
    *returnColumnSizes = (int*)malloc(rx * sizeof(int));

    for (int i = 0; i < rx; i++) {
        (*returnColumnSizes)[i] = 2; // 每行有两列
    }

    return result; // 返回结果数组
}

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

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

相关文章

Spring续集

6.2、转发视图 SpringMVC中默认的转发视图是InternalResourceView SpringMVC中创建转发视图的情况&#xff1a; 当控制器方法中所设置的视图名称以"forward:"为前缀时&#xff0c;创建InternalResourceView视图&#xff0c;此时的视图名称不会被SpringMVC配置文件中所…

前后端开发接口联调对接参数

前言 一个完整的互联网系统项目,需要前后端配合,进行上线,针对前端开发者,现在互联网主流的项目都是前后端分离 也就是后端负责提供数据接口,前端负责UI界面数据渲染 凡是在前台数据展示与用户交互的,都是由前端来实现的,而数据来源是由后台服务提供的 在浏览器c端能够发送后端…

STM32 ~ GPIO不同模式之间的区别与实现原理

GPIO全称General Purpose Input Output &#xff0c;即通用输入/输出。其实GPIO的本质就是芯片的一个引脚&#xff0c;通常在ARM中所有的I/O都是通用的。不过&#xff0c;由于每个开发板上都会设计不同的外围电路&#xff0c;这就造成了GPIO的功能可能有所不同。大部分GPIO都是…

百度测开初面面试题分享(答案+文档)

1、java常用的异常处理机制 Java常用的异常处理机制有以下几种&#xff1a; 1&#xff09;try-catch-finally语句&#xff1a;用于捕获和处理异常。将可能抛出异常的代码放在try块中&#xff0c;然后在catch块中处理异常。无论是否发生异常&#xff0c;finally块中的代码都会…

算法总结10 线段树

算法总结10 线段树 线段树2569. 更新数组后处理求和查询 线段树 有一个数组&#xff0c;我们要&#xff1a; 更新数组的值&#xff08;例如&#xff1a;都加上一个数&#xff0c;把子数组内的元素取反&#xff09;查询一个子数组的值&#xff08;例如&#xff1a;求和&#x…

【进阶篇】MySQL数据库中的 锁详解

文章目录 1. 介绍2. MySQL 锁类型3. 锁的粒度4. 锁的使用场景和示例5. 锁的性能优化和注意事项6. MySQL 的锁机制和实现细节1. 锁的存储和管理2. 锁的竞争和调度3. 锁的实现原理 7. 锁的调优和故障处理1. 锁等待和超时&#xff1a;2. 死锁处理和恢复&#xff1a;3. 锁的监控和分…

AtCoder Beginner Contest 313 C 一个序列同时加一个数和减一个数,直到最大和最小之间相差最大为1(结论可记住)

AtCoder Beginner Contest 313 C 做题链接&#xff1a;AtCoder Beginner Contest 313 问题陈述 给你一个整数序列 A(A1​,A2​,…,AN​)。你可以执行以下操作任意次数&#xff08;可能为零&#xff09;。 选择带有 1≤i,j≤N的整数 i和 j。将Ai​减少 1&#xff0c;将Aj​增…

珂学送分

从后往前倒着走。 先找出每个点能走到的最远的右端点是什么&#xff0c;记录为r[i]&#xff0c;每个点i可能分为的情况有(r[i] - i 1)种&#xff0c;每一种的概率是1 / (r[i] - i 1)&#xff0c;&#xff08;每一种的概率乘以它后面那个格子的期望&#xff09;之和再加自己的…

Python用若干列的数据多条件筛选、去除Excel数据并批量绘制直方图

本文介绍基于Python&#xff0c;读取Excel数据&#xff0c;以一列数据的值为标准&#xff0c;对这一列数据处于指定范围的所有行&#xff0c;再用其他几列数据数值&#xff0c;加以筛选与剔除&#xff1b;同时&#xff0c;对筛选与剔除前、后的数据分别绘制若干直方图&#xff…

Peppercontent.io:人工智能驱动的内容生成工具

【产品介绍】​ 名称 Peppercontent.io 成立时间​ 成立于2017年 具体描述 Peppertype.ai 是一种基于GPT-3的AI辅助工具&#xff0c;而GPT-3则是一种深度学习自回归语言模型。这一技术潜藏着巨大的潜力&#xff0c;可以立刻为企业和创作者提供创意内容&…

JavaScript的DOM操作(二)

一、元素的特性attribute 1.元素的属性和特性 前面我们已经学习了如何获取节点&#xff0c;以及节点通常所包含的属性&#xff0c;接下来我们来仔细研究元素Element。 我们知道&#xff0c;一个元素除了有开始标签、结束标签、内容之外&#xff0c;还有很多的属性&#xff0…

influxdb2.7基本介绍安装与启动

概念 timestamp: influxdb所有的数据都会有一个列_time来存timestamp。默认是以nanosecond格式存储的。field: field就是mysql中的字段&#xff0c;field key存储在_field字段中&#xff0c;field value就是字段值&#xff0c;存储在_value字段中。field key和field value对组…

【Java 基础篇】Java可变参数:灵活处理不定数量的方法参数

在Java编程中&#xff0c;可变参数是一项强大的功能&#xff0c;它允许你编写更加灵活的方法&#xff0c;接受不定数量的参数。本文将详细解释Java可变参数的用法、语法以及最佳实践。 什么是可变参数&#xff1f; 可变参数是Java 5引入的一项功能&#xff0c;它允许你在方法…

【AIGC】提示词 Prompt 分享

提示词工程是什么&#xff1f; Prompt engineering&#xff08;提示词工程&#xff09;是指在使用语言模型进行生成性任务时&#xff0c;设计和调整输入提示&#xff08;prompts&#xff09;以改善模型生成结果的过程。它是一种优化技术&#xff0c;旨在引导模型产生更加准确、…

腾讯mini项目-【指标监控服务重构】2023-07-17

今日已办 根据导师的指导意见 修改了otelclient相关配置的代码 认真学习uptrace的文档&#xff0c;会比otel、signoz的好理解&#xff1a; 什么是OpenTelemetry https://uptrace.dev/opentelemetry/architecture.html#opentelemetry-sdk trace部分介绍 https://uptrace.dev/o…

Vue3上 使用腾讯地图 基础展示

一,注册账号 申请key值 第one步 先注册 腾讯位置服务 - 立足生态&#xff0c;连接未来 (qq.com) 第two步 注册key!!!!! 并选择开发参考的开发文档 选择类型 添加成功后会在我的应用里看到你的key值 第三步 (因为我这里是在pc端使用 就直接只用Web端文档了) 二,加载地图 …

【FPGA项目】进阶版沙盘演练——报文收发(报文处理、CDC、CRC)

前言 书接上文【FPGA项目】沙盘演练——基础版报文收发_子墨祭的博客-CSDN博客&#xff0c;前面我们做了基础版的报文收发&#xff0c;相信对逻辑设计有了一定的认知&#xff0c;在此基础上&#xff0c;继续完善一个实际报文收发可能会遇到的一些处理&#xff1a; 报文处理握手…

布隆过滤器 python3 pybloom_live使用例子 存储开销

1. 安装pybloom_live from pybloom_live import BloomFilter# 创建一个Bloom过滤器对象 # 错误率&#xff08;False Positive Rate&#xff09;在布隆过滤器中指的是&#xff0c;不存在的元素被错误地认为存在于集合中的概率 bf BloomFilter(capacity10000, error_rate0.001)#…

IntelliJ IDEA使用_常规设置

文章目录 版本说明主题设置取消检查更新依赖自动导入禁止import xxx.*、允许import内部类显示行号、方法分割线、空格代码提示&#xff08;匹配所有字母&#xff09;自定义注释颜色添加头部注释自定义字体设置字符编码关联本地GitJDK编译版本Maven配置Tomcat配置代码注释设置头…

iPhone 15秋季发布会召开,媒介盒子多家媒体持续报道

现如今互联网引流成本越来越高不说,难度越来越大,大多数都是投入巨大,收效甚微。因此,用有限的成本带来高回报的效果成为企业共同的追求。 当然,企业想要产品服务引流绝非易事。 为什么你的品牌营销不见效?新产品上市要怎么做宣传?盒子以新发布的苹果15为例分析,给你一些启…