分形之城 | |
|
问题描述
城市的规划在城市建设中是个大问题。不幸的是,很多城市在开始建设的时候并没有很好的规划,城市规模扩大之后规划不合理的问题就开始显现。而这座名为Fractal 的城市设想了这样的一个规划方案,如下图所示:
当城区规模扩大之后,Fractal 的解决方案是把和原来城区结构一样的区域按照图中的方式建设在城市周围,提升城市的等级。对于任意等级的城市,我们把正方形街区从左上角开始按照道路标号。虽然这个方案很烂,Fractal 规划部门的人员还是想知道,如果城市发展到了等级N,编号为A 和B 的两个街区的直线距离是多少。街区的距离指的是街区的中心点之间的距离,每个街区都是边长为10 米的正方形。
输入格式
输入文件包含多组测试数据,第一行有一个整数T 表示测试数据的数目。
每组测试数据包含一行三个整数 N, A, B,表示城市等级以及两个街区的编号。
输出格式
对于每组测试数据,在单独的一行内输出答案,四舍五入到整数。
样例输入
样例输入1
3
1 1 2
2 16 1
3 4 33
样例输入2
2
3 46 56
3 21 42
样例输出
样例输出1
10
30
50
样例输出2
32
61
这题想了好久 发现是我想的太复杂了QwQ...
顺序变换无影响
考虑坐标转换的贡献 其他的就当作 普通情况讨论即可 可得答案 详见code:
#include<bits/stdc++.h> using namespace std; #define ll long long int T; ll a,b,n; ll y1,x1; ll x2,y2; double dist(ll xx,ll xxx,ll yy,ll yyy) { return sqrt((1.000)*(xx-xxx)*(xx-xxx)+(1.000)*(yy-yyy)*(yy-yyy)); } void dfs(ll id,ll &x,ll &y,ll num) { x=0;y=0; if(id==0) return ; ll m=(1<<id-1); ll d=m*m; ll pos=num/d; num=num%d; if(pos==0) {dfs(id-1,x,y,num);int tt=x;x=y;y=tt;} if(pos==1) {dfs(id-1,x,y,num);x=x;y=y+m;} if(pos==2) {dfs(id-1,x,y,num);x=x+m;y=y+m;} if(pos==3) {dfs(id-1,x,y,num);int ttt=x;x=2*m-1-y;y=m-1-ttt;} return ; } int main() { cin>>T; while(T--) { scanf("%lld%lld%lld",&n,&a,&b); x1=y1=x2=y2=0; dfs(n,x1,y1,a-1); dfs(n,x2,y2,b-1); x1*=10; y1*=10; x2*=10; y2*=10; ll d=((1.000)*(dist(x1,x2,y1,y2))+0.5000); printf("%lld ",d); } }