18.06.27 15年期末Stupid cat & Doge

描述

动物园的规划和城市规划一样是个令人头疼的大问题。不幸的是,动物园规划师R.V.L.先生高估了小动物们的智商,他设计了一个极其复杂的动物园道路规划方案,如下图所示:

动物园按照下述方法进行扩建:当动物园规模扩大之后,R.V.L.先生设计的解决方案是把与原来动物园结构一样的区域复制或旋转90度之后按照图中的方式建设在原来的动物园周围(即将原来的动物园复制一遍放在原动物园上方,将顺时针旋转90度后的动物园放在原动物园的左上方,将逆时针旋转90度后的动物园放在原动物园的左方),再用道路将四部分的首尾连接起来,即可提升动物园的等级。

容易看出,等级提升后的动物园仍然是由一条道路连接,等级为N的动物园共能容纳2^2N只小动物,每只小动物将被分配到唯一的一间房屋。对于任意等级的动物园,我们从左上角开始沿着唯一的道路走,按照道路为房屋标号,就能够得到每间房屋的编号了。

说了这么多,智商余额不足的Stupid cat和Doge早已晕头转向。他们想知道,如果城市发展到了一定等级,他俩各自所处的房屋之间的直线距离是多少。房屋之间的距离是指两座房屋中心点之间的距离,你可以认为每间房屋都是边长为10米的正方形。

输入

输入包含多组测试数据,第一行有一个整数 T 表示测试数据的数目。
每组测试数据包含一行用空格隔开的三个整数 N, S, D,表示动物园等级,Stupid cat分配到的房屋编号和Doge分配到的房间编号。

输出

对于每组测试数据,在单独的一行内输出答案,四舍五入到整数。

样例输入

3
1 1 2
2 16 1
3 4 33

样例输出

10
30
50

提示

【数据范围】
N≤31,1≤S,D≤2^2N,1≤T≤10000.

 1 #include <cstdio>
 2 #include <string>
 3 #include <memory.h>
 4 #include <algorithm>
 5 #include <stdlib.h>
 6 #include <math.h>
 7 #include <iostream>
 8 #include<queue>
 9 #include <vector>
10 #include <bitset>
11 using namespace std;
12 
13 long long int level;
14 long long int h1, h2;
15 
16 int x[5] = {0, 1,1,2,2 };// id
17 int y[5] = {0, 1,2,2,1 };
18 
19 long long int findy(long long int,long long int);
20 
21 long long int findx(long long int id,long long int level) {
22     if (level == 1) 
23         return x[id];
24     long long int everypart = pow(4, level - 1);
25     long long int part = (id-1) / everypart+1;
26     long long int newid = id - (part - 1)*pow(4, level - 1);
27     if (part == 1)
28         return findy(id, level - 1);
29     if (part == 2)
30         return findx(id-everypart, level - 1);
31     if (part == 3)
32         return pow(2, level - 1) + findx(id - everypart * 2, level - 1);
33     return pow(2, level) + 1 - findy(id - everypart * 3, level - 1);
34 }
35 long long int findy(long long int id, long long int level) {
36     if (level == 1)
37         return y[id];
38     long long int everypart = pow(4, level - 1);
39     long long int part = (id - 1) / everypart + 1;
40     long long int newid = id - (part - 1)*pow(4, level - 1);
41     if (part == 1)
42         return findx(id, level - 1);
43     if (part == 2)
44         return findy(id - everypart, level - 1)+pow(2,level-1);
45     if (part == 3)
46         return pow(2, level - 1) + findy(id - everypart * 2, level - 1);
47     return pow(2, level-1) - findx(id - everypart * 3, level - 1)+1;
48 }
49 
50 int main()
51 {
52     int t;
53     scanf("%d", &t);
54     while (t--) {
55         cin >> level >> h1 >> h2;
56         long long int x1 = findx(h1, level), y1 = findy(h1, level);
57         long long int x2 = findx(h2, level), y2 = findy(h2, level);
58         long long int ans = round(sqrt(pow((x1 - x2),2) + pow((y1 - y2),2))*10);
59         cout << ans << endl;
60     }
61     return 0;
62 }
View Code

复制粘贴过去的时候没改导致了WA- -|||

以及不用long long就会RE……

猜你喜欢

转载自www.cnblogs.com/yalphait/p/9235578.html
cat