OpenJudge NOI 2.4 8463:Stupid cat Doge

news2024/12/22 22:17:16

【题目链接】

OpenJudge NOI 2.4 8463:Stupid cat & Doge

【题目考点】

1. 递归

2. 分形图

【解题思路】

解法1:递归

1级正方形边长是 2 1 2^1 21,2级正方形边长为 2 2 2^2 22,。。。,n级正方形边长为 2 n 2^n 2n,总格子数量为 2 n ∗ 2 n = 2 2 n 2^n*2^n=2^{2n} 2n2n=22n,n最大为31,因此房屋(格子)编号最大为 2 2 ∗ 31 = 2 62 2^{2*31}=2^{62} 2231=262,int类型无法保存该数值,需要使用long long类型。(long long类型范围: − 2 63 ∼ 2 63 − 1 -2^{63}\sim 2^{63}-1 2632631)

先假设n级正方形中的每个一级正方形都是开口向左的,也就是图中等级1的样子:在这里插入图片描述
以2级正方形为例,可以先把2级正方形想成如下样子

在这里插入图片描述

接下来需要做一些转化,才能变为目标图形。
在这里插入图片描述

首先左上角需要转成开口向上的图形,按道路行进顺序走第几个格子的位置也随之发生变化。经过观察可知,该变化过程是沿主对角线(左上右下)进行翻转的过程。在这里插入图片描述
在这里插入图片描述
观察主对角线两边对应位置,举出例子

左下方格子右上方格子
0,00,0
1,00,1
n-1,00,n-1
n-1,11, n-1

设结构体

struct Pair
{
    long long x, y;
};

表示一个位置,有Pair p, r,p是翻折前的位置,r是翻折后的位置。
因此该规律也可以表示为r.x = p.y, r.y = p.x

左下需要转成开口向下的图形,按道路行进顺序走第几个格子的位置也随之发生变化。经过观察可知,该变化过程是沿副对角线(右上左下)进行翻转的过程。
在这里插入图片描述
在这里插入图片描述
观察副对角线两边对应位置,举出例子

左上方格子右下方格子
0,0n-1,n-1
1,0n-1,n-2
n-1,0n-1,0
n-2,0n-1, 1

位置r翻折后是在位置r,观察后得到规律:p.x+r.y = p.y+r.x = n-1
因此关于副对角线翻折r.x = n-p.y-1, r.y = n-p.x-1

分析递归:
递归问题:在等级n的正方形中找到数值val的位置(等级n的正方形共有 2 2 n 2^{2n} 22n个格子,格子上的数值分别为 0 ∼ 2 2 n − 1 0\sim2^{2n}-1 022n1,val值的范围也是: [ 0 , 2 2 n − 1 ] [0, 2^{2n}-1] [0,22n1])
递归关系
先假设当前等级n的正方形中的4个等级为n-1的小正方形都是开口向左的图形。和1级正方形一样。小正方形编号从0开始数,第0个小正方形在左上方,第1个小正方形在右上方,第2个在右下方,第3个在左下方。
等级n的正方形边长为 2 n 2^n 2n,总格子个数为 2 2 n 2^{2n} 22n,一共包含4个等级n-1的小正方形,小正方形边长sl 2 n − 1 2^{n-1} 2n1,小正方形的格子个数sn 2 2 ( n − 1 ) 2^{2(n-1)} 22(n1)
先确定数值val在第几个小正方形中,

第几个小正方形数值范围
0[0, sn)
1[sn, 2*sn)
2[2*sn, 3*sn)
3[3*sn, 4*sn)

因此val所在等级n-1的小正方形的编号为:val/sn(整除运算),在这个小正方形中,要找的数值为val%sn(取模运算)
递归调用该函数,在第val/sn个正方形中找到数值val%sn的位置,为p。
r为调整后在等级为n的大正方形中val的位置。

  • 如果val在第0个等级为n-1的小正方形中,那么需要对位置p按照小正方形的主对角线进行翻折,即r.x = p.y, r.y = p.x
  • 如果val在第1个等级为n-1的小正方形中,那么val在右上方的格子中,位置p需要向右移动小正方形边长sl个格子,即r.x = p.x, r.y = p.y+sl
  • 如果val在第2个等级为n-1的小正方形中,那么val在右下方的格子中,位置p需要向右和向下分别移动小正方形边长sl个格子,即r.x = p.x + sl, r.y = p.y + sl
  • 如果val在第3个等级为n-1的小正方形中,那么需要对位置p先按照小正方形的副对角线进行翻折r.x = n-p.y-1, r.y = n-p.x-1,而后向下移动sl个格子r.x += sl,整合为:r.x = sl-1-p.y+sl, r.y = sl-1-p.x
    返回位置r。

递归出口:如果等级n为0,那么边长只有1,返回位置(0,0)。

根据上述算法写出递归函数Pair find(int n, long long val),使用该函数,传入猫和狗的房屋编号减一(因为题目给定的房屋编号是从1开始的,我们定义的val是从0开始的),即可求得猫和狗的位置。

得到两只动物的位置后,调用两点间距离公式
d i s ( a , b ) = ( a . x − b . x ) 2 + ( a . y − b . y ) 2 dis(a, b) = \sqrt{(a.x-b.x)^2+(a.y-b.y)^2} dis(a,b)=(a.xb.x)2+(a.yb.y)2 ,乘上单位“10米”,再四舍五入取整,即可得到最终结果。
【注意】四舍五入取整,可以使用printf("%.0f", a)来完成,或者自己写取整函数

long long myRound(double a)
{
	return a+0.5;//返回时自动强转为long long
}

都可以。
该题惟独不能用<cmath>中的round()函数!!!,用了就报错,我也不知为什么。

【题解代码】

解法1:递归

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
struct Pair
{
    LL x, y;
    Pair(){}
    Pair(LL a, LL b):x(a), y(b){}
};
Pair find(int n, LL val)//在等级n的正方形中查找数值val的位置。val的值为0~2^(2*n)-1
{
    if(n == 0)
    	return Pair(0,0);
    LL sl = 1 << (n-1), sn = sl*sl;//sl:小正方形边长2^(n-1) sn:小正方形的元素个数
	Pair p = find(n-1, val%sn), r;//val%sn:在小正方形中的数值 p:val在小正方形中的位置 r:val在大正方形中的位置
    switch(val/sn)//val/sn:val在第几(0,1,2,3)个小正方形中
    {
        case 0://关于主对角线轴对称
        	r.x=p.y, r.y=p.x;
        	break;
        case 1://左上平移到右上
        	r.x = p.x, r.y = p.y + sl;
        	break;
        case 2://左上平移到右下
        	r.x = p.x + sl, r.y = p.y + sl;
        	break;
        case 3://关于副对角线轴对称 p.x+r.y=p.y+r.x=sl-1,再向下移动sl,
        	r.x = sl-1-p.y+sl, r.y = sl-1-p.x;
        	break;
    }
    return r;
 }
double getDis(Pair a, Pair b)
{
     return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
LL myRound(double a)
{
	return a+0.5;//返回时强转为LL 
}
int main()
{
    LL t, n, s, d;//注意:s, d必须声明为LL 
    cin >> t;
    while(t--)
    {
        cin >> n >> s >> d;
        Pair pCat = find(n, s-1), pDog = find(n, d-1);
        cout << myRound(getDis(pCat, pDog)*10) << endl;//注意,不能用<cmath>中的round函数,用了就报错。
    }
    return 0;
}

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

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

相关文章

autojs画六边形

牙叔教程 简单易懂 界面基础代码 "nodejs ui"; require("rhino").install(); const ui require("ui"); class MainActivity extends ui.Activity {constructor() {super();}get layoutXmlFile() {return "layout.xml";}onContentVi…

高效学 C++|继承与组合

继承是面向对象程序设计的重要特性之一。作为面向对象的编程语言&#xff0c;C语言也自然支持这个特性。继承是代码复用的基本方法之一&#xff0c;也是接口和复用设计的关键。本文介绍继承的含义和继承与组合的关系。 01、继承的含义 面向对象程序设计通过将问题域中的事物抽…

Web 应用程序的文件系统写入能力

介绍 NodeJS 之前&#xff0c;JS 操作文件只能通过 HTML <input type"file"> 元素或 XMLHttpRequest&#xff08;或之后的 fetch&#xff09;&#xff0c;来对本地文件进行一些浏览和上传操作。NodeJS 给予了 JS 操作系统底层 API 的能力&#xff0c;但这只能…

章节7 查看和处理文件内容

7-查看和处理文件内容 文本文件 ASCII、UTF-8、Unicode、ANSItxt、xml、conf、properties、yml等配置文件、日志文件、源代码 二进制文件 可执行文件、图片、音频、视频 cat 全拼&#xff1a;concatenate [kənˈkt(ə)nˌeɪt] 连接 格式&#xff1a;cat 文件名 more/…

eyeurl—一款网页批量截图工具

eyeurl使用说明 开发说明 eyeurl由作者&#xff1a;云小书 开发&#xff0c;源于日常渗透测试中&#xff0c;信息收集到的url过多&#xff0c;挨个打开查看比较繁琐&#xff0c;且效率极低&#xff0c;网上有大佬开发的eyewitness&#xff0c;且ui布局各方面都比较完善&#…

sadserver 题目思路概述

背景 从 阮一峰老师的博客 了解到 sadserver 可以在线挑战一些 linux 指令相关问题&#xff08;整体难度一般&#xff0c;但做题体验不错&#xff0c;有提示&#xff09;&#xff0c;这里将目前网站提供的的16道题进行简单解答&#xff0c;提供思路和相关指令 本文csdn 博客地…

初识Java虚拟机

1.概述 Java虚拟机&#xff1a;Java Virtual Machine。正是有了Java虚拟机&#xff0c;Java语言实现了跨平台的特性&#xff0c;一次编译&#xff0c;多处运行。 目前使用范围最广的虚拟机就是Hotspot VM&#xff0c;它是OracleJDK和OpenJDK中的默认Java虚拟机。 相比于其他…

[Android Studio]开发APP应用出现软件程序打开闪退的排错

&#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea; Android Debug&#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea; Topic 发布安卓学习过程中遇到问题解决过程&#xff0c;希望我的解决方案可以对小伙伴们有帮助。 &#x1f4cb;笔记目…

你还没用过Mybatis-Plus?丝般顺滑,快速上手!

一、概述 1.1、什么是MyBatis-Plus MyBatis-Plus (opens new window)&#xff08;简称 MP&#xff09;是一个 MyBatis (opens new window)的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 1.2、特性 无侵入&#xff1a;只做…

RabbitMQ入门前篇

本篇博文目录:一.RabbitMQ1.消息队列2.RabbitMQ3.安装RabbitMQ4.RabbitMQ常用命令二.使用RabbitMQ进行编程1.AMQP2.第一次MQ通信三.RabbitMQ六中工作模式1.RabbitMQ2.Work queues3.pub/sub订阅发布模式4.Routing模式5.主题Topic模式四.RabbitMQ消息确认机制五.源代码下载一.Rab…

我性格比较内向,适合做管理吗?

许多刚走上管理岗位的朋友&#xff0c;都有这样的困惑&#xff1a;1.我比较内向&#xff0c;不适合做管理。2.我不擅长演讲&#xff0c;没有领导才能。3.我太谨小慎微了&#xff0c;做不好领导。4.我太喜欢出风头&#xff0c;静不下心来做管理。5.我太强势了&#xff0c;团队很…

GuLi商城-项目初始结构创建,GitHub仓库创建

GitHub账号和密码 账号&#xff1a;11360XXXXXqq.com 密码&#xff1a;ZH**SH*19**1016 新建仓库&#xff1a; gulimall 记得勾选下Add a README file&#xff0c;上面忘记勾选了&#xff0c;实际建议还是要勾选下 复制路径&#xff1a; 打开IDEA检出项目 创建商品微服务模…

芯片设计|FPGA 设计的指导原则(一)

这一部分主要介绍 FPGA/CPLD 设计的指导性原则&#xff0c;如 FPGA 设计的基本原则、基本设计思想、基本操作技巧、常用模等。 FPGA/CPLD 设计的基本原则、思想、技巧和常用模块是一个非常大的问题&#xff0c;在此不可能面面俱到&#xff0c;只能我们公司项目中常用的一些设计…

权值线段树 详解+操作模板(c++)

文章目录权值线段树添加一个数字求某数出现的次数查询一段区间中数字出现的次数查询整个值域中第k小的数查询整个值域中第k大的数例子&#xff1a;求逆序对关于基本线段树与线段树的模板&#xff0c;请看我们之前发布的博客&#xff1a; 线段树入门详解 维护加法乘法&#xff0…

关于“茴香豆的‘茴’有几种写法”:学习过程中,若时间精力有限则优先记住最好用的一种

学习过程中的细节整理和精力节省权衡 我平时学习有整理总结、记笔记的习惯。 我学新东西总是很慢&#xff0c;因为细节处几乎都不会放过&#xff0c;会去发散&#xff0c;去深挖&#xff0c;去比较之前。 刚才上网&#xff0c;查了C语言中二维数组的赋值方式&#xff0c;某个…

UVM实战笔记(七)

第七章. UVM中的寄存器模型 7.1 寄存器模型简介 7.1.1 带寄存器配置总线的DUT 本章节使用的DUT带寄存器配置&#xff0c;代码如下&#xff1a; module dut(clk,rst_n,bus_cmd_valid,bus_op,bus_addr,bus_wr_data,bus_rd_data,rxd,rx_dv,txd,tx_en)input clk; …

DaVinci:Camera Raw(Sony RAW)

本文主要介绍 Sony RAW 格式素材相关的 Camera Raw 参数。解码质量Decode Quality解码质量决定了图像解拜耳之后所呈现的素质。默认为“使用项目设置” Use project setting&#xff0c;表示使用项目设置对话框中的“Camera RAW”解码质量设置。还可选择&#xff1a;全分辨率 -…

JavaEE-网络编程

目录一、网络编程套接字二、UDP Socket2.1 客户端服务器程序-回显服务(EchoServer)2.1.1 UdpEchoServer2.1.2 UdpEchoClient2.1.3 一个简单程序三、TCP 客户端服务器程序3.1 TCP API一、网络编程套接字 网络编程套接字就是操作系统给应用程序提供的一组API(叫做socket API)。 …

NLP学习笔记(七) BERT简明介绍

大家好&#xff0c;我是半虹&#xff0c;这篇文章来讲 BERT\text{BERT}BERT (Bidirectional Encoder Representations from Transformers) 原始论文请戳这里 0 概述 从某种程度上来说&#xff0c;深度学习至关重要的一环就是表征学习&#xff0c;也就是学习如何得到数据的向…

怎么把两个PDF合并?教你们几个简单的方法

不知道大家平时处理文件的数量多不多&#xff0c;但是小编日常处理文件真的特别多&#xff0c;所以小编经常会使用专业的格式转换器来处理文件&#xff0c;这样就可以高效处理文件了&#xff0c;例如我们需要将多个PDF文件合并&#xff0c;这样就只需要传输一个文件就可以了&am…