可怕的宇宙射线

2023-05-16

题意:
宇宙射线会在无限的二维平面上传播(可以看做一个二维网格图),初始方向默认向上。宇宙射线会在发射出一段距离后分裂,向该方向的左右45°方向分裂出两条宇宙射线,同时威力不变。宇宙射线会分裂n次,每次分裂后会在分裂方向前进ai 个单位长度。计算出共有多少个位置会被打击。
输入:
输入第一行包含一个正整数n(n <= 30),表示宇宙射线会分裂n次,第二行包含n个正整数a1,a2…an,第i个数ai(ai <= 5)表示第i次分裂的宇宙射线会在它原方向上继续走多少个单位长度。
输出:
输出一个数ans,表示有多少个位置会被降智打击。
输入样例:
4
4 2 2 3
输出样例:
39
解题思路:
这道题目思路非常清晰,一定可以使用递归完成。于是理清楚思路开始写递归函数solve。solve函数倒是挺容易写出来的,注意用一个数组来存储每一次分裂前行走的路程,一个num用来帮助判断递归结束的条件。然后对每个方向进行分类讨论,往set中插入点的下一个坐标(set可以自动去重复)。这一次分裂前的路程走完了很自然的递归调用solve(cx, cy, (d+7)%8, num+1)与 solve(cx, cy, (d+1)%8, num+1)继续往左右45度角两个方向继续前进,最后只需要输入set的size即可,到此程序完美结束。可惜只能过一半的评测点,另一半会超时。然后我们发现两次递归中其实可以减少一次递归,因为左右是对称的,我们只需要dfs到头再回溯到起点,这个过程中利用对称的性质不断将点对称便可以得到所有点的坐标。无论选择一直向右还是一直向左我们都只需要调用一次solve函数进行递归即可。注意改进后的程序需要首先dfs到头,故要先递归调用一次solve,然后对set中所有点对称,然后再对这一次应该经过的路径加在set中。对称的坐标变换公式很容易由初中数学知识进行推导,总共只有四种对称的情况。
注意事项:
1、按照d(方向参数)分类讨论太傻了,直接用偏移量数组会使程序更简洁一些。
2、如果默认起点坐标为(0,0),那么第一次调用函数应该是solve(0, -1, 0, 1),因为(0,-1)不会被记录到set中,但这并不妨碍大局。因为图上点的坐标是我们认为指定的,即使使用solve(0, 0, 0, 1)也只是代表图中起点为(0,1)而已,set的size不变,只是具体坐标改变。
总结:
一个dfs的应用题,使用递归求解,注意递归参数和递归结束条件的选择。递归很容易超时,这里发现利用对称性可以减少一次递归从而减少时间复杂度。
参考代码:

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <vector>
#include <list>
#include <queue>
#include <stack>
#include <map>
#include <iomanip>
#include <algorithm>
#include <set>
#include <string>
#include <cstring>
using namespace std;
int a[40];
set<pair<int, int> > s;
int n;
void solve(int cx,int cy,int d,int num){
    if(num>n)return;
    int x=a[num];
    int x2=cx;int y2=cy;
    if(d==0){
        while (x--) {
            y2++;
        }
        solve(x2, y2, (d+7)%8, num+1);
    }
    if(d==1){
        while (x--) {
            y2++;x2++;
        }
        solve(x2, y2, (d+7)%8, num+1);
    }
    if(d==2){
        while (x--) {
            x2++;
        }
        solve(x2, y2, (d+7)%8, num+1);
    }
    if(d==3){
        while (x--) {
            x2++;y2--;
        }
        solve(x2, y2, (d+7)%8, num+1);
    }
    if(d==4){
        while (x--) {
            y2--;
        }
        solve(x2, y2, (d+7)%8, num+1);
    }
    if(d==5){
        while (x--) {
            y2--;x2--;
        }
        solve(x2, y2, (d+7)%8, num+1);
    }
    if(d==6){
        while (x--) {
            x2--;
        }
        solve(x2, y2, (d+7)%8, num+1);
    }
    if(d==7){
        while (x--) {
            y2++;x2--;
        }
        solve(x2, y2, (d+7)%8, num+1);
    }
    for (set<pair<int, int> > ::iterator it=s.begin(); it!=s.end(); it++) {
        if(d==0||d==4){
            s.insert(pair<int, int>(2*cx-it->first,it->second));
        }
        if(d==2||d==6){
            s.insert(pair<int, int>(it->first,2*cy-it->second));
        }
        if(d==1||d==5){
            s.insert(pair<int, int>(it->second-cy+cx,cy+it->first-cx));
            }
        if(d==3||d==7){
            s.insert(pair<int, int>(cx+cy-it->second,cy+cx-it->first));
        }
    }
    x=a[num];
    if(d==0){
        while (x--) {
            cy++;
            s.insert(pair<int, int>(cx,cy));
        }
    }
    if(d==1){
        while (x--) {
            cy++;cx++;
            s.insert(pair<int, int>(cx,cy));
        }
    }
    if(d==2){
        while (x--) {
            cx++;
            s.insert(pair<int, int>(cx,cy));
        }
    }
    if(d==3){
        while (x--) {
            cx++;cy--;
            s.insert(pair<int, int>(cx,cy));
        }
    }
    if(d==4){
        while (x--) {
            cy--;
            s.insert(pair<int, int>(cx,cy));
        }
    }
    if(d==5){
        while (x--) {
            cy--;cx--;
            s.insert(pair<int, int>(cx,cy));
        }
    }
    if(d==6){
        while (x--) {
            cx--;
            s.insert(pair<int, int>(cx,cy));
        }
    }
    if(d==7){
        while (x--) {
            cy++;cx--;
            s.insert(pair<int, int>(cx,cy));
        }
    }
}
int main() {
    cin>>n;
    for (int i=1; i<=n; i++) {
        cin>>a[i];
    }
    solve(0, -1, 0, 1);
    cout<<s.size()<<endl;
    return 0;
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

可怕的宇宙射线 的相关文章

  • oracle 用exp导出表

    用于导出oracle数据库表空间的表 xff0c 有以下几种情况 一般导出 xff1a exp username password 64 ip地址 实例 file 61 路径及文件名 导出表空间指定的表 exp username passw
  • 动态获取API的地址

    原理 xff1a 现在虽然大部分Win32程序都使用ExitProcess函数来终止执行 xff0c 但是其实用ret指令也是可以的 我们的应用程序的主程序可以被看成是一个被Windows调用的子程序 当父进程要创建一个子进程时 xff0c
  • 使用go做后端,用户密码采取bcrpyt哈希加密

    bcrypt哈希由多个部分组成 这些部分用于确定创建哈希的设置 xff0c 从而可以在不需要任何其他信息的情况下对其进行验证 相较于MD5 xff0c SHA 256等哈希算法更适合用于做密码的哈希 xff0c 原因在于bcrypt算法哈希
  • 4 Spring Cloud微服务入门之OpenFeign总结

    1 OpenFeign是什么 官网 https spring io projects spring cloud openfeign OenFeign 是一个声明式的WebService客户端 使用openfeign 能让编写Web Serv
  • Ubuntu18.04安装ssh并实现本机免密登录

    hadoop需要使用SSH的方式登陆 xff0c linux下需要安装SSH 客户端已经安装好了 xff0c 一般只需要安装服务端就可以了 Ubuntu默认并没有安装ssh服务 xff0c 如果通过ssh远程连接到Ubuntu xff0c
  • AndroidStdio换源

    Android Stdio开发学习2022 10 2 第一步 换源 Android Stdio默认源是外国的 xff0c 访问很慢 xff0c 所以需要换成国内的镜像源 阿里源 xff1a https maven aliyun com ne
  • 【杂物间3】AI,ML,RL,DL,NLP,CV…搞清了这些是啥

    pre 在看一篇公众号推文的时候 xff0c 里面有这么一句话 xff1a 诶 xff0c 看这意思 xff0c CV xff0c NLP xff0c RL xff0c GNN是DL的纵向领域 xff1f 其他三个尚且眼熟 xff0c 但R
  • 数据库系统课后作业1

    关系模式 xff1a Department dNo dName officeRoom homePage Student sNo sName sex age dNo Course cNo cName cPNo credit dNo SC sN
  • 保研面试/考研复试机器学习问题整理

    1 什么是梯度爆炸和梯度消失 xff1f 如何解决梯度消失 梯度爆炸 xff1f 在反向传播过程中需要对激活函数进行求导 xff0c 如果导数大于 1 1 1 xff0c 那么随着网络层数的增加梯度更新将会朝着指数爆炸的方式增加这就是梯度爆
  • 树莓派连接vnc教程

    1 输入 sudo raspi config 进入到系统设置中开启vnc服务 2 进入后选择 Interfacing Options 进入 3 选择 VNC 进入 4 yes 下载软件 xff1a VNC Viewer 5 连接vnc xf
  • Hive之解析Json数组

    目录 Hive自带的json解析函数1 get json object函数2 json tuple函数 Hive解析json数组一 嵌套子查询解析json数组二 使用 lateral view 解析json数组 Hive自带的json解析函
  • MobaXterm实现代理功能及把内网服务器,用公网地址转发出去。

    MobaXterm实现代理功能及把内网服务器 xff0c 用公网地址转发出去 1 MobaXterm配置 192 168 1 82为内网 xff0c 需要公网连接上来 xff0c 所以用公网服务器做代理使用 xff0c 实现ssh 公网ip
  • docker-compose 搭建 nextcloud + onlyoffice 实现在线编辑,云存储等多项功能。

    添加源 yum span class token function install span epel release y 关闭防火墙 xff0c selinux systemctl stop firewalld systemctl dis
  • WiFi 中继/桥接功能 — 基于OpenWRT路由器

    一 中继和桥接介绍 1 网络拓扑图 2 功能介绍 1 无线中继 无线中继 xff0c 即无线分布系统 WDS 组网 xff0c 其工作原理是将无线信号从上一个中继点接力传递到下一个中继点 xff08 下一个点可以在不同信道上接收和转发 xf
  • 经典数学问题——三门问题(数据分析面试题)

    三门问题出自美国的电视游戏节目 Let s Make a Deal xff0c 问题名字来自该节目的主持人蒙提 霍尔 xff08 Monty Hall xff09 xff0c 所以三门问题又叫做蒙提霍尔悖论 让我们来看看三门问题 xff1a
  • N5095-Ubuntu系统开启Jellyfin硬件解码

    N5095 Ubuntu系统开启Jellyfin硬件解码 一 升级Ubuntu内核至5 18 ubuntu22 04安装后 xff0c 默认的内核版本为5 15 xff0c 而这个版本内含一个bug xff0c 导致11代IntelCPU无
  • 国产银河麒麟系统V10忘记密码重置操作

    国产电脑有忘记密码的 xff0c 因为银河麒麟系统是基于linux系统的 xff0c 不必像windows操作系统那样需要使用U盘来进行重置密码 xff0c 好像还简单一些 基本的操作也就3步 1 重启电脑进入Grub引导菜单 2 编辑引导
  • CentOS7安装xrdp(windows远程桌面连接linux)

    前提 CentOS安装桌面 xff0c 如果无桌面 xff0c 请执行 xff1a yum y groups install GNOME Desktop startx 1 安装xrdp 更具自己的系统位数选择对应的包 如果是32位使用则选择
  • Git命令测试(含结果图)

    Git命令测试 xff08 含结果图 xff09 一 文件添加 提交 xff08 一 xff09 初始化本地仓库 xff08 二 xff09 新建一个本地文件hello txt xff08 三 xff09 将该文件进行添加 xff08 四
  • OSPF协议实验

    目录 OSPF 三个阶段 OSPF实验 1拓扑搭建 2配置PC的ip信息 3配置路由 4完成配置进行测试 总结 OSPF OSPF Open Shortest Path First开放式最短路径优先 xff09 是一个内部网关协议 Inte

随机推荐

  • Linux 安装软件是错误:正在等待缓存锁:无法获得锁 /var/lib/dpkg/lock-frontend。锁正由进程

    原因是 xff1a 一般出现这种原因是因为文件上锁或者被占用解决办法 xff1a 删除lock xff1a sudo rm var cache apt archives lock删除lock xff1a sudo rm var lib dp
  • 封神台(尤里的复仇Ⅱ 回归)渗透第一步 信息收集1

    前言解题过程 前言 做这道题的时候 xff0c 我的心情真是跌宕起伏 为什么这么说 xff0c 且听我娓娓道来 解题过程 打开传送门 xff0c 被传送到这个网站 随便点了几个模块 xff0c 感觉都没有可利用的漏洞 xff0c 直接扫描目
  • 封神台(尤里的复仇Ⅱ 回归)绕过防护getshell

    解题思路 习惯在url后加admin xff0c 看是不是管理后台 一看发现是 xff0c 就不用目录扫描工具了 填入正确的验证码 xff0c 抓包输入 39 xff0c 查看有无报错 发现报错了 xff0c 存在报错注入 xff0c 看报
  • sql注入绕过安全狗4.0

    1 前言2 前置知识3 绕过关键字主要思路3 1绕过连体关键字思路3 2绕过单个关键字思路 4 以sqli labs Less 1 为例 xff0c 绕过安全狗4 1拦截order by4 2拦截union select4 3拦截datab
  • error during connect: This error may indicate that the docker daemon is not running解决方法

    因为我的截图工具截屏快捷键是ctrl 43 q xff0c docker desktop退出的快捷键也是ctrl 43 q xff0c 所以当我按了ctrl 43 q之后 xff0c docker desktop退出了 xff0c 然后我在
  • getshell思路

    getshell能干嘛文件上传getshell文件包含getshellsql注入getshell操作系统漏洞getshellRCE getshell总结 授人以鱼 xff0c 不如授人以渔 getshell能干嘛 1 执行终端命令 2 文件
  • hackmyvm入门(靶机网络配置)

    hackmyvm概述hackmyvm靶机下载地址靶机网络配置测试环境环境搭建 愉快玩耍 hackmyvm概述 hackmyvm是一个平台 xff0c 包含了大量靶机 xff0c 类似于vulnhub hackthebox等平台 xff0c
  • hackmyvm Rei靶机练习

    主机发现端口扫描漏洞挖掘权限提升 主机发现 攻击机ip 靶机ip sn 发送arp请求包探测目标ip是否在线 端口扫描 p 所有端口扫描 sV 查询开放端口的服务 这里65333是ssh服务 xff0c 63777是http服务 最好拿个记
  • web中间件日志分析脚本3.0(shell脚本)

    新添功能保存的日志代码 新添功能 3 0版本加了ssrf 目录遍历文件包含 优化自动创建目录功能 一般使用1 6 7即可 3 1版本 框架漏洞检测 封面字体颜色改变 保存的日志 fi 目录遍历 sqli ssrf xss 代码 span c
  • nginx版本平滑升级(超详细)

    一 前期准备二 开始实验安装旧版本安装新版本 三 可能遇到的问题 文章背景 xff1a 护网期间 xff0c 客户跟我说nginx有0day漏洞 xff0c 需要版本升级 xff0c 我寻思着我也不是运维啊 xff0c 问我干嘛 xff08
  • AndroidStudio2021.3logcat工具无法显示日志解决办法

    我的AS版本 2021 3 日志没有任何输出 解决办法 1 File gt setting 2 搜索logcat xff0c 点击Experimental 3 把logcat对应的选项去掉 4 重启AS就可以看到日志信息
  • Ubuntu 20.04 安装mysql数据库教程

    1 首先安装mysql程序 命令 xff1a sudo apt install mysql server 2 安装完查看mysql启动状态 xff1a 命令 xff1a systemctl status mysql 3 直接使用root账户
  • 一文了解按位操作符中左移与右移

    无意中看到 gt gt lt lt gt gt gt 说实话一点也不知道这是什么 xff0c 带着好奇心去了解了一下 本文从一个小白的角度看这三个按位操作符的意思 xff0c 会相对好理解 按位操作符操作数字的二进制形式 xff0c 但是返
  • 2080Ti+win10+anaconda+pycharm+tensorflow-gpu(亲测有效)

    参考了很多方法 xff0c 发现一个非常智能的配置环境的方法 不用单独安装vc xff0c vs xff0c cuda xff0c cudnn xff0c 也不用考虑他们的版本搭配问题 xff0c 也不用环境变量的配置 可以通过不同的虚拟环
  • 乐维监控配置HTTPS访问教程

    前提条件 配置前需部署好的乐维监控系统 准备SSL证书 1 1 生成自签名证书 首先 xff0c 先生成自签名证书 这里提供一个快速生成证书的脚本 执行脚本需要输入一个IP或域名的参数 然后会在脚本所在目录下面生成名为ssl crt的证书和
  • Python tkinter布局与按钮间距设置

    新建label与button xff0c 并设置位置 xff08 grid xff09 import tkinter as tk root 61 tk Tk label 61 tk Label root text 61 Label labe
  • 程序设计思维与实践 - CSP - M2

    文章目录 程序设计思维与实践 CSP M2Problem A HRZ的序列DescriptionInputOutputSample InputSample OnputNoteIdeaCodes Problem B HRZ学英语Descrip
  • 程序设计思维与实践 Week8 作业

    文章目录 Problem A 区间选点 IIDescriptionInputOutputSample InputSample OnputNoteIdeaCodes Problem B 猫猫向前冲DescriptionInputOutputS
  • linux操作基础----系统管理

    linux操作基础 系统管理 基于之前三篇 xff1a linux基础操作之文件操作命令 linux基础操作之常用命令 linux基础操作之文件权限 xff0c 查找 xff0c 链接 继续总结linux的命令及操作 xff0c 本次对li
  • 可怕的宇宙射线

    题意 xff1a 宇宙射线会在无限的二维平面上传播 可以看做一个二维网格图 xff0c 初始方向默认向上 宇宙射线会在发射出一段距离后分裂 xff0c 向该方向的左右45 方向分裂出两条宇宙射线 xff0c 同时威力不变 宇宙射线会分裂n次