描述
动物园的规划和城市规划一样是个令人头疼的大问题。不幸的是,动物园规划师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 }
复制粘贴过去的时候没改导致了WA- -|||
以及不用long long就会RE……