昨天看了y总关于这题的讲解,z=2和z=3这两种情况返回值苦思不得其解
y总的坐标轴向下是x轴,向右是y轴,我的坐标轴是x轴向右,y轴向上
大家仔细看我的z=1和z=3的情况
向右的方向为平行于x轴的方向;
向下的方向为平行于y轴方向;
以最左上角的点为原点
翻转时为了顺序从小到大
其他部分看y总视频就明白了。
下面我讲以下z=3时的情况
#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll;
typedef pair<ll,ll>Pll;
Pll calc(ll n,ll m)
{
if(n==0) return {0,0};
ll len=1ll<<(n-1),cnt=1ll<<(2*n-2);
ll z=m/cnt;
Pll pos=calc(n-1,m%cnt);
ll x=pos.first,y=pos.second;
if(z==0) return {y,x};
if(z==1) return {x+len,y};
if(z==2) return {x+len,y+len};
return {len-1-y,2*len-1-x};
}
int main()
{
int T;
cin>>T;
while(T--)
{
ll N,A,B;
cin>>N>>A>>B;
Pll ac=calc(N,A-1);
Pll bc=calc(N,B-1);
double x=ac.first-bc.first,y=ac.second-bc.second;
printf("%.0lf\n",sqrt(x*x+y*y)*10);
}
}
希望更丰富的展现?使用Markdown
哈哈,这个刚开始写的,忘改了