成人免费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-05-03 15:59:00

黑盒打印機

2025-05-07 00:31:30

2011-01-10 14:41:26

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

運維架構技術

2021-02-26 11:54:38

MyBatis 插件接口

2011-02-22 13:46:27

微軟SQL.NET

2021-12-28 08:38:26

Linux 中斷喚醒系統Linux 系統

2021-12-02 11:39:28

Git服務器Linux

2022-03-14 14:47:21

HarmonyOS操作系統鴻蒙

2022-01-08 20:04:20

攔截系統調用

2022-07-27 08:16:22

搜索引擎Lucene

2023-04-26 12:46:43

DockerSpringKubernetes

2022-12-07 08:42:35

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲午夜精品一区二区三区他趣 | 中文字幕国产视频 | a级毛片国产 | 日韩高清中文字幕 | 国产超碰人人爽人人做人人爱 | 欧美精品一区二区三区蜜桃视频 | 91视频免费在观看 | 黄色在线免费播放 | av色站 | 一区二区成人在线 | 国产精品乱码一区二区三区 | 亚洲精品国产成人 | 国产欧美日韩一区 | 亚洲一区二区在线 | 亚洲欧美中文日韩在线v日本 | 免费看国产一级特黄aaaa大片 | 久久久久久国产精品免费免费 | 日韩精品一区二区三区视频播放 | 国产免费观看视频 | 久久久久久国产 | 91久久久精品国产一区二区蜜臀 | 在线欧美一区 | 久久一区二区三区电影 | 91资源在线 | 精品久久久一区 | 欧美一区永久视频免费观看 | 神马影院一区二区三区 | 一区二区国产在线 | 国产一级片在线观看视频 | 天天操天天射综合 | www.夜夜骑 | 欧美久久久电影 | 国产精品一区二区三区免费观看 | 青青草一区 | 亚洲日本中文字幕在线 | 99精品视频网 | 视频一区在线 | 亚洲成人天堂 | 久久国产福利 | 91免费视频观看 | 亚洲国产精品人人爽夜夜爽 |