题目链接
一、题目解析
比较复杂的一道题目,最大的难点在于坐标变换
#include<bits/stdc++.h>
using namespace std;
/*以左上角为坐标原点建立坐标系
城镇改为从0开始编号
注意不同分区的坐标变化
*/
typedef long long ll;
pair<ll,ll> navigate(int n,ll m)//n为城市等级,m为城市在该等级下的等效编号
{
if(n == 0) return make_pair(0,0);//0级城市仅有一个房子,坐标为(0,0)
ll c1 = 1LL << (2*(n - 1));//上一级城市有2^(2*(n-1))个房子
pair<ll,ll> prev = navigate(n - 1,m % c1);//上一个等级下城市的坐标
ll p = m / c1;//判断城市在n等级下的方位
ll cnt = 1LL << (n - 1);//辅助坐标转换
ll x = prev.first, y = prev.second;
if(p == 0)
//左上角
return make_pair(y,x);
if(p == 1)
//右上角
return make_pair(x,y + cnt);
if(p == 2)
//右下角
return make_pair(x + cnt,y + cnt);
if(p == 3)
//左下角
return make_pair(2 * cnt - y - 1,cnt - x - 1);
}
double dis(pair<ll,ll> a,pair<ll,ll> b)
{
ll xx = a.first - b.first;
ll yy = a.second - b.second;
return 10 * sqrt((double)(xx * xx + yy * yy));
}
int main()
{
int N,n;
ll a,b;
cin >> n;
while(n--)
{
cin >> N;
cin >> a >> b;
pair<ll, ll> coodinatea = navigate(N, a - 1);
// cout << "coodinatea" << ' ' << coodinatea.first << ' ' << coodinatea.second << endl;
pair<ll, ll> coodinateb = navigate(N, b - 1);
// cout << "coodinateb"<< ' ' << coodinateb.first << ' ' << coodinateb.second << endl;
cout << (ll)(dis(coodinatea,coodinateb) + (double)0.5) << endl;
//注意四舍五入
}
}