成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

分形之城:遞歸超典型例題,還沒明白?手把手畫給你看!

開發 前端
當城區規模擴大之后,Fractal 的解決方案是把和原來城區結構一樣的區域按照圖中的方式建設在城市周圍,提升城市的等級。

[[411094]]

本文轉載自微信公眾號「Piper蛋窩」,作者Piper蛋。轉載本文請聯系Piper蛋窩公眾號。

題目

城市的規劃在城市建設中是個大問題。

不幸的是,很多城市在開始建設的時候并沒有很好的規劃,城市規模擴大之后規劃不合理的問題就開始顯現。

而這座名為 Fractal 的城市設想了這樣的一個規劃方案,如下圖所示:

當城區規模擴大之后,Fractal 的解決方案是把和原來城區結構一樣的區域按照圖中的方式建設在城市周圍,提升城市的等級。

對于任意等級的城市,我們把正方形街區從左上角開始按照道路標號。

雖然這個方案很爛,Fractal 規劃部門的人員還是想知道,如果城市發展到了等級 ,編號為 和 的兩個街區的直線距離是多少。

街區的距離指的是街區的中心點之間的距離,每個街區都是邊長為 米的正方形。

輸入格式

第一行輸入正整數n ,表示測試數據的數目。

以下 n行,輸入 n組測試數據,每組一行。

每組數據包括三個整數 N,A, B,表示城市等級以及兩個街區的編號,整數之間用空格隔開。

輸出格式

一共輸出 行數據,每行對應一組測試數據的輸出結果,結果四舍五入到整數。

數據范圍

輸入樣例:

  1. 3  
  2. 1 1 2  
  3. 2 16 1  
  4. 3 4 33  

輸出樣例:

  1. 10  
  2. 30  
  3. 50  

題解

這有啥不明白的,手把手畫出來!

首先明確,為啥能用遞歸:

  • 我們想計算 n 等級的坐標,知道 n-1 等級的坐標就行

然后思考怎么遞歸?

咱們首先規定,每個等級的坐標系原點是獨特的,如下圖。

然后我們從特殊到一般,歸納推規律:

  • 等級1這個塊塊,如果放到等級2里,有四種情況要討論
  • 等級1放到等級2的左上象限,則相當于順時針旋轉了 90° ,并且還要沿 y 軸翻轉(為什么要沿 y 軸翻轉呢?因為你注意每個編號的位置,不翻轉,形狀雖然對上了,但是編號順序沒對上)
  • 等級1放到等級2的右上象限,則不用轉
  • 等級1放到等級2的右下象限,則不用轉
  • 等級1放到等級2的左下象限,則相當于逆時針旋轉了 90° ,并且還要沿 y 軸翻轉

轉完了,因為我們現在從等級1到等級2了,因此坐標系原點也移動了,所以要在等級1的原有坐標基礎上進行平移。

好了,我給你畫個圖,你就懂了。

然后你再去看代碼。

這里補充一點數學知識:

  • 對于點 (x, y) ,沿原點順時針旋轉 90° ,將變為 (y, -x)
  • 對于點 (x, y) ,沿原點逆時針旋轉 90° ,將變為 (-y, x)
  • 對于點 (x, y) ,以 y 軸為對稱軸翻轉將變為 (-x, y)

代碼

  1. #include <iostream> 
  2. #include <cstring> 
  3. #include <cmath>  // sqrt 
  4. #include <algorithm> 
  5.  
  6. using namespace std; 
  7.  
  8. typedef long long LL; 
  9. typedef pair<LL, LL> PLL; 
  10.  
  11. PLL calc(LL n, LL m) 
  12.     /* 
  13.     * n: 等級 
  14.     * m: 坐標,從0開始計數 
  15.     */ 
  16.     if (n == 0) return {0, 0}; 
  17.     LL len = 1ll << (n - 1);  // 2^{n-1} 本等級內象限的邊長/2 
  18.     LL cnt = 1ll << (2 * n - 2);  // 4^{n-1} 本等級內象限容量 
  19.     PLL pos = calc(n - 1, m % cnt);  // 上一等級的坐標信息 
  20.     LL x = pos.first, y = pos.second
  21.     int z = m / cnt;  // 處于哪個象限 
  22.     // 左上象限順轉90°(y,-x)沿y對稱(-y,-x)更換原點(-y-len,-x+len) 
  23.     if (z == 0) 
  24.         return { - y - len, - x + len }; 
  25.     // 右上象限更換原點(x+len,y+len) 
  26.     else if (z == 1) 
  27.         return { x + len, y + len }; 
  28.     // 右下象限更換原點(x+len,y-len) 
  29.     else if (z == 2) 
  30.         return { x + len, y - len }; 
  31.     // 左下象限逆轉90°(-y,x)沿y對稱(y,x)更換原點(y-len,x-len) 
  32.     return { y - len, x - len }; 
  33.  
  34. int main() 
  35.     int N; 
  36.     cin >> N; 
  37.     while (N --) 
  38.     { 
  39.         LL n, m1, m2; 
  40.         cin >> n >> m1 >> m2; 
  41.         PLL pos1 = calc(n, m1 - 1); 
  42.         PLL pos2 = calc(n, m2 - 1); 
  43.  
  44.         double delta_x = (double) (pos1.first - pos2.first); 
  45.         double delta_y = (double) (pos1.second - pos2.second); 
  46.         // 等級1中 len 是單位長度,且表示象限的一半長即為 10 / 2 = 5 
  47.         printf("%.0lf\n", sqrt(delta_x * delta_x + delta_y * delta_y) * 5); 
  48.     } 

參考資料

[1]Acwing: https://www.acwing.com

[2]98. 分形之城: https://www.acwing.com/problem/content/100/

 

責任編輯:武曉燕 來源: Piper蛋窩
相關推薦

2025-06-12 10:27:02

2023-12-06 08:28:44

禮物系統用例圖

2021-01-21 09:10:29

ECharts柱狀圖大數據

2021-01-08 10:32:24

Charts折線圖數據可視化

2011-01-10 14:41:26

2011-05-03 15:59:00

黑盒打印機

2025-05-07 00:31:30

2021-07-14 09:00:00

JavaFX開發應用

2021-06-05 23:51:21

ECharts氣泡圖散點圖

2020-02-21 19:54:09

HTTPS 配置手把手教

2020-02-21 10:45:06

運維架構技術

2011-02-22 13:46:27

微軟SQL.NET

2021-02-26 11:54:38

MyBatis 插件接口

2021-12-28 08:38:26

Linux 中斷喚醒系統Linux 系統

2020-12-07 09:01:58

冪等系統f(f(x)) =f(

2023-04-26 12:46:43

DockerSpringKubernetes

2022-01-08 20:04:20

攔截系統調用

2021-12-02 11:39:28

Git服務器Linux

2022-03-14 14:47:21

HarmonyOS操作系統鴻蒙

2022-07-27 08:16:22

搜索引擎Lucene
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品1区 | 91视频免费黄 | 国产激情一区二区三区 | 国产一区二区免费电影 | a免费在线| 一级黄色片网址 | 久久久精品久久久 | 日本视频一区二区三区 | 欧美日韩成人 | 亚洲一区在线日韩在线深爱 | 久草网址 | 国产 欧美 日韩 一区 | 久久久精品视频一区二区三区 | 午夜精品久久久 | 国产一区二区三区在线看 | 三区在线| 羞羞视频网 | 国产电影精品久久 | 日韩精品在线播放 | 日韩av三区 | 国产一区二区精品在线 | 91视频播放 | 综合久久久 | 国产在线中文字幕 | 在线国产一区二区三区 | 男人的天堂avav | 欧美成人激情视频 | 毛片av免费在线观看 | 精品久久精品 | 日本亚洲欧美 | 国产三区视频在线观看 | 久久精品二区 | 国产精品777一区二区 | 亚洲视频在线观看一区二区三区 | 天天看天天摸天天操 | 91欧美激情一区二区三区成人 | 一区二视频 | 亚洲精品欧洲 | 亚洲美女一区二区三区 | 欧美成人精品一区二区男人看 | 日本欧美视频 |