分形之城

  • 简化问题:求距离->求A、B两点的坐标
  • 把握本质:只考虑操作对坐标的影响
  • 简化运算:给1、2、3、4、5、6、7、8、9、10、11、12、13、14、15、16分组需要特判整除,归根结底是因为没有从0开始编号,把它们各自减1,变成0、1、2、3、4、5、6、7、8、9、10、11、12、13、14、15,就不需要特判了
#include <bits/stdc++.h>
using namespace std;
typedef pair<long long,long long> pll;
double dist(pll a,pll b)
{
	double x=10.0*abs(a.first-b.first);
	double y=10.0*abs(a.second-b.second);
	return sqrt(x*x+y*y);
}
pll calc(int n,long long x)
{
	if(n==0)
	{
		return pll(1,1);
	}
	long long area=(1ll<<(2*(n-1)));
	pll y=calc(n-1,x%area);
	switch(x/area)
	{
		case 0:
			return pll(y.second,y.first);
			break;
		case 1:
			return pll(y.first,y.second+(1<<(n-1)));
			break;
		case 2:
			return pll(y.first+(1<<(n-1)),y.second+(1<<(n-1)));
			break;
		default:
			return pll((1<<(n-1))+1-y.second+(1<<(n-1)),(1<<(n-1))+1-y.first);
			break; 
	}
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int T;
	cin>>T;
	while(T--)
	{
		long long n,a,b;
		cin>>n>>a>>b;
		a--;
		b--;
		cout<<fixed<<setprecision(0)<<dist(calc(n,a),calc(n,b))<<endl;
	}
	return 0;
}
posted @ 2025-03-05 15:10  D06  阅读(12)  评论(0)    收藏  举报
//雪花飘落效果