bzoj2263: Pku3889 Fractal Streets

给出两点编号,求如图所示的图中两点间欧氏距离*10取整

递归处理由编号求出坐标

#include<cstdio>
#include<cmath>
int T,n,s,t;
void get(int n,int p,int&x,int&y){
    if(!n){
        x=y=0;
        return;
    }
    int D=1<<n*2-2,L=1<<n-1;
    int w=p/D;
    get(n-1,p&(D-1),x,y);
    if(w==0){
        int x0=x,y0=y;
        x=y0,y=x0;
    }else if(w==1){
        x+=L;
    }else if(w==2){
        x+=L;
        y+=L;
    }else{
        int x0=x,y0=y;
        x=L-1-y0;
        y=L*2-1-x0;
    }
}
int main(){
    for(scanf("%d",&T);T;--T){
        scanf("%d%d%d",&n,&s,&t);
        int x1,y1,x2,y2;
        get(n,s-1,x1,y1);
        get(n,t-1,x2,y2);
        printf("%d
",(int)round(hypot(x1-x2,y1-y2)*10));
    }
    return 0;
}
原文地址:https://www.cnblogs.com/ccz181078/p/7122613.html