フラクタル通りpoj3889

都市計画は、都市建設では大きな問題です。

都市計画と不十分な問題の拡大が表示されるようになった後残念ながら、建設の初めに多くの都市では、良い計画ではありません。

下に示すように、そのようなA計画のフラクタルアイデアと呼ばれる都市:

city.png

都市規模の拡張後、フラクタル溶液は、図街の建物の周りの方法に従った領域の元の都市構造と同じである、都市のレベルを高めます。

街の任意のレベルのために、我々は道路勾配に合わせて正方形のブロックを左上から開始します。

このプログラムは吸うが、スタッフフラクタル企画部門はまだ知りたい、二つのブロックAとBの直線距離番号がNのレベルに開発された都市は、ある場合。

中央ブロックとの間の距離からのブロックを指し、各ブロックの一辺の長さは10メートルの正方形です。

入力形式

整数入力の最初の行のn A n-は、試験データの数を表します。

次のN 、N行、N個のテスト入力データのセットを、各ライン。

データの各セットは三つの整数含む  N A B 、整数間のスペースで区切られたN、A、B、都市レベルを示し、数字の2つのブロック、。

出力フォーマット

総出力N- 、N行、出力テストデータのセットに各行対応する、結果を最も近い整数に丸められます。

データ範囲

1 N 31 1≤N≤31、
1 A B 2 2 N 1≤A、B≤22N、
1 N 1000年1≤n≤1000

サンプル入力:

3 
1 1 2 
2 16 1 
3 4 33 

出力例:

10 
30 
50 

基本パターン指定⭐注:図グリッドの参照番号が、実際には、格子点(座標点)の左上隅を指し

                  

図4 

図4は、左上の方向にのみX方向となり、Y座標、すなわち図、入れ替え。4(x、y)が(Y、X)となります

 図5

長い図のように右上へ。4(x、y)は(X、Y + LEN)LEN(この層は都市の半分の辺の長さである)となります

 

 

 6

下側図の右上隅。4(x、y)は(x + lenは、Y + LEN)となります

 

 

 図7

左下隅、最も困難な、いくつかの変換装置(X、Y) - "(X、Y - (LEN - 1)) - "( - (Y - LEN + 1)、 - X)、すなわち(LEN - Y - 1 、-x) - 「(LEN - Y + lenを、(LEN - 1) - X)

           

 

 

 最初の左に特別な注意そのyのように - lenは、しかし!それは(2 / LEN)+ lenを - 私たちは、右上隅の座標をy -len + 1、なぜないyがそうすることを、原点ですしたいですか?

 私たちは、左上に分かれているが、右上、左下ので、右、実際には、どんな小さなも4つに細分化されていてもよい低級、私たちの目的は、座標原点の右上隅(その周りに他のすべての小さな家を作ることですユニット1の代わりに(2 / LEN)からの翻訳は、これは右上変換(右上の座標に相当するように)座標変換/ 2 lenをすることができないので、変換されます)

⭐注意:图中虽然标号在格子内,其实指的是格子左上角的点(是一个坐标点)

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define P pair<ll, ll>
 5 
 6 int t, n;
 7 
 8 P calc(int n, ll m)
 9 {
10     if (!n) return {0, 0};
11     ll len =1ll << (n - 1), cnt = 1ll << ((n << 1) - 2); 12 P a = calc(n - 1, m % cnt); 13 ll z = m / cnt, x = a.first, y = a.second; 14 if (!z) return {y, x}; 15 if (z == 1) return {x, y + len}; 16 if (z == 2) return {x + len, y + len}; 17 return {(len << 1) - y - 1, len - 1 - x}; 18 } 19 20 int main() 21 { 22 scanf("%d", &T); 23(t--ながら)24 {25 LLのA、B。26のscanf( "%D%LLD%LLD"、&N、&、&B)。27 P X = CALC(N - 1 )。28 PのY = CALC(N、B - 1 )。29 LL DX = x.first - y.first、DY = x.second - y.second。30二重ANS =(SQRT(DX * DX + DY * DY)* 10 )。31のprintf( "%の0.lf \ n"は、ANS)。32 } 33リターン0 34}

 

 

 

おすすめ

転載: www.cnblogs.com/2aptx4869/p/12417095.html