2022 Robocom CAIP 国赛 第二题

news2024/11/22 17:06:28

原题链接:

PTA | 程序设计类实验辅助教学平台

题面:

副本是游戏里的一个特色玩法,主要为玩家带来装备、道具、游戏资源的产出,满足玩家的游戏进程。

在 MMORPG《最终幻想14》里,有一个攻略人数最大达到 48 人的副本“零式贡希尔德神庙”,其中守关 BOSS “天佑女王”有一个很有趣的技能:“女王的大敕令”。

技能在一个 5×5 的棋盘上展开。每位玩家根据给定的两个步长,从某个方格出发,在棋盘上先走 D1​ 步,再走 D2​ 步。其中“步长”指的是曼哈顿距离,即:设两个方格的坐标分别为 (Xi​,Yi​) 以及 (Xj​,Yj​),则这两个方格的曼哈顿距离 D=∣Xi​−Xj​∣+∣Yi​−Yj​∣。

例如下图中的 A 点与 B 点的曼哈顿距离为 5:

image.png

技能开始时,场地外围会出现 4 只小怪,东南西北(即棋盘的右、下、左、上)方向各出现一只小怪,且小怪一定出现在某行或某列对应的位置上。第 i 只小怪会顺时针朝固定方向移动 ni​ 步(题目保证不会移出界,即移动后仍然在对应着某行/某列的位置上),且:

  • 北边的小怪固定向右移动;
  • 东边的小怪固定向下移动;
  • 南边的小怪固定向左移动;
  • 西边的小怪固定向上移动。

小怪出现后,棋盘上还会出现一个发光的格子,这是玩家移动的目标点,如图所示:

image.png

玩家必须在不被小怪杀死的前提下,按规定步长,用两个回合到达目标点。技能流程如下:

1、玩家先选择一个起始方格;

2、东、西两侧的小怪开始按照固定方向移动,移动完毕后 4 只小怪会同时开展攻击,其中东、西两侧的小怪攻击自己所对应的一整行,南、北两侧的小怪攻击自己所对应的一整列。玩家若处在攻击区内则任务失败。

3、玩家移动 D1​ 步,到达某个方格;

4、南、北两侧的小怪开始按照固定方向移动,移动完毕后 4 只小怪会同时开展攻击,同第 2 步;

5、玩家移动 D2​ 步,此时必须到达目标点,否则任务失败。

以下是上面的 4 只小怪都移动后的攻击范围的示意图:

image.png

给定小怪起始位置以及移动步数 ni​ 和目标点位置,请输出所有安全的移动方案,包括起始点以及第一次移动的目的地。

输入格式:

输入第一行是四个数 C1​,C2​,R1​,R2​,分别表示:

  • 北边(上面)的小怪 1 在第 C1​ 列的位置上;
  • 南边(下面)的小怪 2 在第 C2​ 列的位置上;
  • 西边(左边)的小怪 3 在第 R1​ 行的位置上;
  • 东边(右边)的小怪 4 在第 R2​ 行的位置上。

输入第二行是四个数 ni​(i=1,⋯,4),按照上面的顺序给出小怪移动的步数,保证小怪移动后仍然处于某行或某列对应的位置上。

输入第三行是四个数 row,col,D1​,D2​,依次表示目标点的位置,以及玩家要走的两个步长。这里某方格的“位置” (row,col) 指的是该方格的行号、列号组成的二元组。

我们假设左上角的方格位置为 (1, 1)。

输出格式:

输出安全移动的方案,方案由两个位置共四个数组成,前两个数为初始选择的方格的位置,后两个数为第一次停留的位置。

对于多个方案的情况,先按初始方格位置从小到大输出,初始方格相同时按第一次停留位置从小到大输出。一个坐标 (ri​,ci​) 比另一个坐标 (rj​,cj​) 小,当且仅当 ri​<rj​,或 ri​=rj​ 的同时有 ci​<cj​。

输入样例:

2 4 4 2
1 2 3 2
5 3 3 4

输出样例:

2 1 2 4
2 3 3 1
2 3 3 5

解题思路:

先预处理出怪物两次攻击分别影响到的行和列。然后枚举合适的方案。

先枚举玩家的初始位置,在此基础上枚举玩家第一次移动的目标位置。

位置的限制条件:

1、不可在敌人当前攻击轮次的攻击范围内。

2、当前位置可达、并且可从当前位置抵达终点。比较特殊的是初始位置的判断,初始位置到终点的曼哈顿距离如果和d1+d2的差值是2的倍数,那么我们是存在可能从这个位置先走d1步再走d2步到达终点位置的,否则这个位置不可行。

具体实现细节见代码。

代码(CPP):

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e3 + 10;
const int INF = 0x3fffffff;
const int mod = 1000000007;
int C1;     // 北(上)
int C2;     // 南(下)
int R1;     // 西(左)
int R2;     // 东(右)
int n1, n2, n3, n4;    // 怪物移动步数
int row, col, d1, d2;  // 目标点的位置,玩家要走的两个步长
int fc1, fc2, fr1, fr2;  // 第一次攻击后
int sc1, sc2, sr1, sr2;  // 第二次攻击后

void initAttack() {
    int c1, c2, r1, r2;
    c1 = C1, c2 = C2, r1 = R1, r2 = R2;
    // 第一轮
    r1 -= n3;
    r2 += n4;
    fc1 = c1;
    fc2 = c2;
    fr1 = r1;
    fr2 = r2;

    // 第二轮
    c1 += n1;
    c2 -= n2;
    sc1 = c1;
    sc2 = c2;
    sr1 = r1;
    sr2 = r2;
}

void solve() {
    cin >> C1 >> C2 >> R1 >> R2;
    cin >> n1 >> n2 >> n3 >> n4;
    cin >> row >> col >> d1 >> d2;
    // 预处理两次攻击分别的覆盖行列范围
    initAttack();

    // 枚举判断合适的方案
    for (int r = 1; r <= 5; r++) {  // 枚举初始站位
        if (r == fr1 || r == fr2)   // 该行在第一轮攻击范围
            continue;
        for (int c = 1; c <= 5; c++) {
            if (c == fc1 || c == fc2)   // 该列在第一轮攻击范围
                continue;
            if (((abs(r - row) + abs(c - col)) - (d1 + d2)) % 2 != 0)  // 该初始点走d1+d2步无法到达终点
                continue;
            // 枚举到可能适合的初始站位了, 判断这个初始站位是否可以到达终点
            for (int rr = 1; rr <= 5; rr++) {   // 枚举第一次行走的方格
                if (rr == sr1 || rr == sr2)         // 该行在第二轮攻击范围
                    continue;
                for (int cc = 1; cc <= 5; cc++) {
                    if (cc == sc1 || cc == sc2)     // 该列在第二轮攻击范围
                        continue;
                    if ((abs(rr - r) + abs(cc - c)) != d1)      // 这个位置不可以从初始位置到达
                        continue;
                    if ((abs(rr - row) + abs(cc - col)) != d2)  // 这个位置不可以抵达终点
                        continue;
                    // 找到了适合的方案,输出
                    cout << r << " " << c << " " << rr << " " << cc << endl;
                }
            }
        }
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cout << fixed;
    cout.precision(18);

    solve();
    return 0;
}

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

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

相关文章

Office如何通过VSTO进行EXCEL插件开发?

文章目录 0.引言1.工具准备2.EXCEL外接程序创建和生成3.外接程序生成并使用 0.引言 VSTO&#xff08;Visual Studio Tools for Office &#xff09;是VBA的替代&#xff0c;是一套用于创建自定义Office应用程序的Visual Studio工具包。VSTO可以用Visual Basic 或者Visual C#扩展…

SPEC CPU 2006 在 CentOS 5.0 x86_64 古老系统测试【3】静态编译 invalid run

上篇 SPEC CPU 2006 在 CentOS 5.0 x86_64 古老系统测试【2】_hkNaruto的博客-CSDN博客 修改gcc41.cfg&#xff0c;全部添加上-static 测试指令 runspec -c gcc41.cfg -T all -n 3 -r 1 -I -i ref all 结果&#xff1a;正常运行并生成报告 invalid run Invalid SPEC CFP2006…

【算法基础】2.1栈和队列(单调栈和单调队列)

文章目录 例题3302. 表达式求值&#xff08;栈的应用&#xff09;&#x1f62d;&#x1f62d;&#x1f62d;&#x1f62d;&#x1f62d;830. 单调栈知识点解法 154. 滑动窗口 &#xff08;单调队列&#xff09;知识点解法 相关链接 & 相关题目 例题 3302. 表达式求值&…

在进行自动化测试,遇到验证码的问题,怎么办?

1.找开发去掉验证码或者使用万能验证码 2.使用OCR自动识别 使用OCR自动化识别&#xff0c;一般识别率不是太高&#xff0c;处理一般简单验证码还是没问题 这里使用的是Tesseract-OCR,下载地址&#xff1a;https://github.com/A9T9/Free-Ocr-Windows-Desktop/releases 怎么使…

linux centos7 静默安装 oracle 11g,【亲测有效】,包含远程连接、提供安装包

Centos7 安装oracle11g 环境准备 操作系统 centos7 oracle版本 oracle11g 终端软件 MobaXterm 192.168.46.61 oracleMaster 安装包 网盘地址 一、安装前准备 1、关闭selinux [rootoracleMaster ~]# vim /etc/selinux/config修改 SELINUX 为 disabled # This file controls …

网络安全(黑客技术)自学

引言 ✈️网络安全&#xff0c;顾名思义&#xff0c;无安全&#xff0c;不网络。现如今&#xff0c;安全行业飞速发展&#xff0c;我们呼吁专业化的 就职人员 与 大学生 &#xff0c;而你&#xff0c;认为自己有资格当黑客吗&#xff1f; ✒️本文面向所有信息安全领域的初学者…

希尔排序

希尔排序 排序步骤 1、分组&#xff0c;以任意长度进行分组&#xff08;这个长度我们称作增量gap&#xff09;&#xff1b;通常以总长度的一半这个数为依据进行分组&#xff0c;每间隔 gap 个数即为一组 2、组内排序&#xff1b;组内使用插入排序法进行排序 3、重新设置间隔…

Wi-Fi 相关概念

Wi-Fi 相关概念 802.11 Wi-Fi 标准及其含义频宽 和 带宽 的概念20MHz与40MHz的区别2.4G 频段2.4G的频道编号和中心频率 5G WiFi 频段中国开放的的5G WiFi频段&#xff1a;5G的频道编号和中心频率&#xff1a; 802.11历史进程一、802.11重要发展二、802.11协议族 参考 802.11 Wi…

阿里云 OSS 静态网站托管

本文节选自我的博客&#xff1a;阿里云 OSS 静态网站托管 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是MilesChen&#xff0c;偏前端的全栈开发者。&#x1f4dd; CSDN主页&#xff1a;爱吃糖的猫&#x1f525;&#x1f4e3; 我的博客&#xff1a;爱吃糖的猫&…

云计算的学习(六)

六、云计算的发展趋势 1.云计算相关领域介绍 1.1物联网 物联网来源于互联网&#xff0c;是万物互联的结果&#xff0c;是人和物、物和物之间产生通信和交互。 物联网主要技术&#xff1a; RFID技术&#xff08;射频识别技术&#xff09;传感器技术嵌入式系统技术 1.2大数据…

SpringBoot+actuator和admin-UI实现监控中心

使用SpringBoot很久了&#xff0c;但是很少使用到SpringBoot的查看和监控&#xff0c;将来八成也不会用到&#xff0c;万一有机会用到呢&#xff1f;所以记录一下以前学习SpringBootactuator和adminUI实现监控中心的方式 Springboot的版本2.0.x <parent><groupId>…

在Linux下做性能分析2:ftrace

介绍 在我们进一步介绍更多模型分析技巧前&#xff0c;我们先要对基本工具有一些了解。这一篇先介绍ftrace的基本用法。 ftrace在内核的Documentation目录下已经有文档了&#xff0c;我这里不是要对那个文档进行翻译&#xff0c;而是要说明这个工具的设计理念和使用策略。细节…

H3C-Cloud Lab实验-链路聚合实验

实验拓扑图&#xff1a; 实验需求&#xff1a; 1、按照图示配置PC3和PC4的IP地址 2、在SW1和SW2的两条直连链路上配置链路聚合&#xff0c;实现链路冗余&#xff0c;并可以增加传输带宽 3、SW1和SW2之间的直连链路要配置为Trunk类型&#xff0c;允许所有vlan通过 4、中断SW…

基于JavaSwing+Mysql的仓库销售管理系统

点击以下链接获取源码&#xff1a; https://download.csdn.net/download/qq_64505944/88049275 JDK1.8 MySQL5.7 功能&#xff1a;管理员与员工两个角色登录&#xff0c;基础数据查找&#xff0c;仓库查找&#xff0c;增删改查仓库信息、商品等 源码数据库文件配置文件课程设…

java单元测试(调试)

文章目录 测试分类JUnit单元测试介绍引入本地JUnit.jar编写和运行Test单元测试方法设置执行JUnit用例时支持控制台输入10.6.6 定义test测试方法模板 测试分类 **黑盒测试&#xff1a;**不需要写代码&#xff0c;给输入值&#xff0c;看程序是否能够输出期望的值。 **白盒测试…

LangChain + ChatGLM2-6B 搭建个人专属知识库

之前教过大家利用 langchain ChatGLM-6B 实现个人专属知识库&#xff0c;非常简单易上手。最近&#xff0c;智谱 AI 研发团队又推出了 ChatGLM 系列的新模型 ChatGLM2-6B&#xff0c;是开源中英双语对话模型 ChatGLM-6B 的第二代版本&#xff0c;性能更强悍。 树先生之所以现…

GitUI汉化

1.下载汉化文件 下载地址 备用下载地址 https://files.cnblogs.com/files/chenghu/git-gui-zh-master.zip https://files.cnblogs.com/files/chenghu/git-gui-zh-master.zip 2.找到git安装路径 C:\Program Files\Git\mingw64\share\git-gui\lib 3.解压出1下载的文件 复制粘…

配置无线网卡AP模式为wifi热点

1、判断网卡是否支持AP 不管是自带无线网卡、还是外接的usb无线网卡&#xff0c;要先配置为AP热点模式。需要看检查是否支持AP模式。 例如&#xff0c;这里插入 rtl8811c 的双频usb无线网卡&#xff0c;iwconfig查看网卡信息 nvidianvidia-desktop:~$ iwconfig wlan0 un…

数据结构——各种常见算法的实现方法和思路

文章目录 常见的排序算法类型复杂度和稳定性 1.冒泡排序2.直接插入排序3.希尔排序4.简单选择排序方法1&#xff1a;双向遍历选择排序方法2&#xff1a;单向遍历选择排序 5.归并排序方法1&#xff1a;递归方法2&#xff1a;非递归 6.快速排序方法1&#xff1a;随机取keyi方法2&a…

GD32F303 DAM串口接收

1.设置串口 串口配置比较常规&#xff0c;我只应用的空闲中断。 2.DMA设置 我设置的DMA是串口接收到数据后保存到数组里&#xff0c;数组满了以后会自动从头开始&#xff0c;并且会进入一次DMA中断。