POJ3889Fractal Streets
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 445 | Accepted: 162 |
Description
More work is not something Chris needs right now, since like any
good bureaucrat, he is extremely lazy. Given that this is a character
trait he has in common with most computer scientists it should come as
no surprise that one of his closest friends, Paul, is in fact a computer
scientist. And it was Paul who suggested the brilliant idea that has
made Chris a hero among his peers: Fractal Streets! By using a Hilbert
curve, he can easily fill in rectangular plots of arbitrary size with
very little work.
A Hilbert curve of order 1 consists of one "cup". In a Hilbert curve
of order 2 that cup is replaced by four smaller but identical cups and
three connecting roads. In a Hilbert curve of order 3 those four cups
are in turn replaced by four identical but still smaller cups and three
connecting roads, etc. At each corner of a cup a driveway (with mailbox)
is placed for a house, with a simple successive numbering. The house in
the top left corner has number 1, and the distance between two adjacent
houses is 10m.
The situation is shown graphically in figure 2. As you can see the
Fractal Streets concept successfully eliminates the need for boring
street grids, while still requiring very little effort from our
bureaucrats.

As a token of their gratitude, several mayors have offered Chris a
house in one of the many new neighborhoods built with his own new
scheme. Chris would now like to know which of these offerings will get
him a house closest to the local city planning office (of course each of
these new neighborhoods has one). Luckily he will not have to actually
drive along the street, because his new company "car" is one of those
new flying cars. This high-tech vehicle allows him to travel in a
straight line from his driveway to the driveway of his new office. Can
you write a program to determine the distance he will have to fly for
each offier (excluding the vertical distance at takeoff and landing)?
Input
A line containing a three positive integers, n < 16 and h, o < 231, specifying the order of the Hilbert curve, and the house numbers of the offered house and the local city planning office.
Output
One line containing the distance Chris will have to fly to his work in meters, rounded to the nearest integer.
Sample Input
3
1 1 2
2 16 1
3 4 33
Sample Output
10
30
50
Source
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath> inline void read(long long &x)
{
x = ;char ch = getchar(),c = ch;
while(ch < '' || ch > '')c = ch, ch = getchar();
while(ch <= '' && ch >= '')x = x * + ch - '', ch = getchar();
if(c == '-')x = -x;
} const long long INF = 0x3f3f3f3f; long long t, N, S, D, pow4[], pow2[]; struct Node
{
long long x, y;
Node(long long _x, long long _y){x = _x,y = _y;}
Node(){}
}; //求解编号为m的房子,在逆时针旋转p度后的n级城市中的坐标
//p只能取值0,90,270
//90,270编号反转,0不变 Node cal(long long n, long long p, long long m)
{
if(n == )
{
if(p == )
{
if(m == )return Node(,);
else if(m == ) return Node(,);
else if(m == ) return Node(,);
else return Node(,);
}
else if(p == )
{
if(m == )return Node(,);
else if(m == ) return Node(,);
else if(m == ) return Node(,);
else return Node(,);
}
else if(p == )
{
if(m == )return Node(,);
else if(m == ) return Node(,);
else if(m == ) return Node(,);
else return Node(,);
}
else if(p == )
{
if(m == )return Node(,);
else if(m == ) return Node(,);
else if(m == ) return Node(,);
else return Node(,);
}
}
Node tmp;
long long a = pow4[n - ];
long long r = (m - ) / a + ;
if(p == )
{
if(r == ) tmp = cal(n - , , m);
else if(r == ) tmp = cal(n - , , m - a), tmp.y += pow2[n - ];
else if(r == ) tmp = cal(n - , , m - * a), tmp.x += pow2[n - ], tmp.y += pow2[n - ];
else tmp = cal(n - , , m - a * ), tmp.x += pow2[n - ];
}
else if(p == )
{
if(r == ) tmp = cal(n - , , m), tmp.x += pow2[n - ], tmp.y += pow2[n - ];
else if(r == ) tmp = cal(n - , , m - a), tmp.y += pow2[n - ];
else if(r == ) tmp = cal(n - , , m - a * );
else tmp = cal(n - , , m - a * ), tmp.x += pow2[n - ];
}
else if(p == )
{
if(r == ) tmp = cal(n - , , m);
else if(r == ) tmp = cal(n - , , m - a), tmp.x += pow2[n - ];
else if(r == ) tmp = cal(n - , , m - * a), tmp.x += pow2[n - ], tmp.y += pow2[n - ];
else tmp = cal(n - , , m - * a), tmp.y += pow2[n - ];
}
else if(p == )
{
if(r == ) tmp = cal(n - , , m), tmp.x += pow2[n - ], tmp.y += pow2[n - ];
else if(r == ) tmp = cal(n - , , m - a), tmp.x += pow2[n - ];
else if(r == ) tmp = cal(n - , , m - a * );
else tmp = cal(n - , , m - a * ), tmp.y += pow2[n - ];
}
return tmp;
} int main()
{
//freopen("data.txt", "r" ,stdin);
read(t);
pow4[] = , pow2[] = ;
for(register int i = ;i <= ;++ i) pow4[i] = (pow4[i - ] << ), pow2[i] = (pow2[i - ] << );
Node tmp1, tmp2;
for(;t;-- t)
{
read(N),read(S),read(D);
tmp1 = cal(N, , S);
tmp2 = cal(N, , D);
double len = sqrt((long long)abs(tmp1.x - tmp2.x) * abs(tmp1.x - tmp2.x) + (long long)abs(tmp1.y - tmp2.y) * abs(tmp1.y - tmp2.y)) * ;
printf("%lld\n", (long long)(len + 0.5));
}
return ;
}
POJ3889
POJ3889Fractal Streets的更多相关文章
- POJ 3889 Fractal Streets(逼近模拟)
$ POJ~3889~Fractal~Streets $(模拟) $ solution: $ 这是一道淳朴的模拟题,最近发现这种题目总是可以用逼近法,就再来练练手吧. 首先对于每个编号我们可以用逼近法 ...
- Codeforces 1070J Streets and Avenues in Berhattan dp
Streets and Avenues in Berhattan 我们首先能发现在最优情况下最多只有一种颜色会分别在行和列, 因为你把式子写出来是个二次函数, 在两端取极值. 然后我们就枚举哪个颜色会 ...
- One-Way Streets (oneway)
One-Way Streets (oneway) 题目描述 Once upon a time there was a country with nn cities and mm bidirection ...
- poj3889 fractal streets
分形街道 我干,这个毒瘤. 想起来就头痛. 首先看题就是一大难题...... 说一下题目大意吧. 每当n+1时,把n阶图复制为4份.2*2排好. 右边两个不动.左上顺时针旋转90°,左下逆时针旋转90 ...
- Luogu4652 CEOI2017 One-Way Streets 树上差分
传送门 题意:给出$N$个点.$M$条无向边的图,现在你需要给它定向,并满足$Q$个条件:每个条件形如$(x_i,y_i)$,表示定向之后需要存在路径从$x_i$走向$y_i$.问每条边是否都有唯一定 ...
- CF 1070J Streets and Avenues in Berhattan
DP的数组f其实开得不够大,应该开200000,但是它在cf上就是过了... 题意是把一堆字母分别分配到行和列. 分析一下,答案实际上只和n行中和m列中每种字母分配的个数有关.而且答案只和" ...
- bzoj2263: Pku3889 Fractal Streets
给出两点编号,求如图所示的图中两点间欧氏距离*10取整 递归处理由编号求出坐标 #include<cstdio> #include<cmath> int T,n,s,t; vo ...
- 【刷题】LOJ 2480 「CEOI2017」One-Way Streets
题目描述 给定一张 \(n\) 个点 \(m\) 条边的无向图,现在想要把这张图定向. 有 \(p\) 个限制条件,每个条件形如 \((xi,yi)\) ,表示在新的有向图当中,\(x_i\) 要能够 ...
- CodeForces 1070J Streets and Avenues in Berhattan 性质+动态规划
题目大意: 你有$k$个数,分为$26$种 对于每个数,你可以选择选进$A$集合或者$B$集合或者不选 要求$A$集合中必须有$n$个数,$B$集合中必须有$m$个数 记第$i$种数在$A$集合中的个 ...
随机推荐
- 路飞学城-Python爬虫集训-第三章
这个爬虫集训课第三章的作业讲得是Scrapy 课程主要是使用Scrapy + Redis实现分布式爬虫 惯例贴一下作业: Python爬虫可以使用Requests库来进行简单爬虫的编写,但是Reque ...
- InceptionV3代码解析
InceptionV3代码解析 参考博文:https://blog.csdn.net/superman_xxx/article/details/65451916 读了Google的GoogleNet以 ...
- 阿里云安全研究成果入选人工智能顶级会议 IJCAI 2019, 业界首次用AI解决又一难题!
8月10日至8月16日,国际人工智能组织联合会议IJCAI 2019(International Joint Conference on Artificial Intelligence 2019)在中 ...
- Web API 接口说明文档
1.采用 Web API Help Page 显示效果 2.swaggerui 创建文档接口 效果图 3.swagger ui 安装配置 nuget 安装 2.设置xml文件 3.配置根路径 预览sw ...
- (转)AngularJS判断checkbox/复选框是否选中并实时显示
最近做了一个选择标签的功能,把一些标签展示给用户,用户选择自己喜欢的标签,就类似我们在购物网站看到的那种过滤标签似的: 简单的效果如图所示: 首先看一下html代码: <!DOCTYPE htm ...
- 【Redis安装】部署与基本配置 --基于Mac和Linux
Redis安装与部署[基于Mac和Linux] 一.Redis简介 基于内存的Key-Value高性能NoSQL数据库 二.Redis下载和解压 进入官网下载最新版的Redis,目前是5.0.0,这个 ...
- WPF DataGrid 数据绑定之"List配合Dictionary"
WPF 的DataGrid是WPF中最为强大的控件之一,可以通过各种方式绑定 例如通过最为形似的dataTable来绑定 本文则用List<Dictionary<K,V>>来绑 ...
- IO流18 --- RandomAccessFile实现数据的读写操作 --- 技术搬运工(尚硅谷)
RandomAccessFile实例化时,需要设置读写模式 示例:复制文件 @Test public void test16() throws IOException { RandomAccessFi ...
- jmeter是什么
Apache JMeter 是Apache 组织开发的基于 Java 的压力测试工具: 适用的测试领域:地方 用于对软件做压力测试,它可以用于测试静态和动态资源,例如:静态文件,Java 小程序.CG ...
- Mysql指定部分数据同步
一.需求背景 朋友的公司需要每天定时从源端定时同步一部分数据到目标端,库中存在company_id列的表,只将指定的company_id列导入到目标端数据库:存在company_id列的表,将表中所有 ...