リンク:
https://www.acwing.com/problem/content/description/100/
質問の意味:
都市計画は、都市建設では大きな問題です。
残念ながら、建設の初めに多くの都市は、良い計画は、都市計画の展開後、ではなく、不十分な問題が表示されるようになりました。
以下に示すように都市は、そのような計画のフラクタルアイデアと呼ばれます:
city.png
都市規模の拡張後、フラクタル溶液を図街の建物の周りの方法に従った領域の元の都市構造と同じである、都市のレベルを高めます。
街の任意のレベルのために、我々は道路勾配に基づいて、左上の正方形のブロックから開始します。
このプログラムは吸うが、二つのブロックAとBのNのレベルに開発された都市、番号の直線距離がある場合は、スタッフフラクタル計画部門は、まだ、知りたいです。
中央ブロックとの間の距離からのブロックを指し、各ブロックの一辺の長さは10メートルの正方形です。
アイデア:
理解本の思想、n段は、具体的には、コードプッシュ方式を見て、ステージN-1の座標に基づいて座標を導入しました。
コード:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef long long ll;
typedef pair<long long, long long> PairLL;
typedef pair<long long, long long> PLL;
PairLL Cal(LL n, LL pos)
{
if (n == 0)
return make_pair(0LL, 0LL);//当处在第0级的时候,只有一间房屋,返回0,0
LL len = 1LL<<(n-1);//n-1级图形的边长
LL cnt = 1LL<<(2*n-2);//n-1级图形的节点数
PairLL now = Cal(n-1, pos%cnt);//在下一级的地图中是第几个节点
LL x = now.first, y = now.second;
LL p = pos/cnt;
//从左往右为y轴正方向, 由上往下为x轴正方向,看书一直没发现,一直没搞懂
if (p == 0)
return make_pair(y, x);//由在当前坐标先顺时针旋转90度, 得到(y, len-1-x), 同时因为转到上方时顺序颠倒.
//y轴要对称调换,即变为(y, len-1-(len-1-x) 即(y, x)
if (p == 1)
return make_pair(x, y+len);//右上角即当前坐标向右平移.
if (p == 2)
return make_pair(x+len, y+len);//右下角即当前坐标向右下平移
return make_pair(len+len-1-y, len-1-x);//先逆时针旋转90度,得到(len-1-y, x)
//同时y轴的对调变为(len-1-y, len-1-x),在因为要向下平移x再加上len.
}
int main()
{
int t;
scanf("%d", &t);
while (t--)
{
LL a, b, n;
scanf("%lld %lld %lld", &n, &a, &b);
PairLL aa = Cal(n, a-1);
PairLL bb = Cal(n, b-1);
LL lenx = aa.first-bb.first;
LL leny = aa.second-bb.second;
double res = (sqrt(double(lenx*lenx+leny*leny))*10);
printf("%.0lf\n", res);
}
return 0;
}