自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

開發(fā) 前端
當(dāng)城區(qū)規(guī)模擴(kuò)大之后,F(xiàn)ractal 的解決方案是把和原來城區(qū)結(jié)構(gòu)一樣的區(qū)域按照?qǐng)D中的方式建設(shè)在城市周圍,提升城市的等級(jí)。

[[411094]]

本文轉(zhuǎn)載自微信公眾號(hào)「Piper蛋窩」,作者Piper蛋。轉(zhuǎn)載本文請(qǐng)聯(lián)系Piper蛋窩公眾號(hào)。

題目

城市的規(guī)劃在城市建設(shè)中是個(gè)大問題。

不幸的是,很多城市在開始建設(shè)的時(shí)候并沒有很好的規(guī)劃,城市規(guī)模擴(kuò)大之后規(guī)劃不合理的問題就開始顯現(xiàn)。

而這座名為 Fractal 的城市設(shè)想了這樣的一個(gè)規(guī)劃方案,如下圖所示:

當(dāng)城區(qū)規(guī)模擴(kuò)大之后,F(xiàn)ractal 的解決方案是把和原來城區(qū)結(jié)構(gòu)一樣的區(qū)域按照?qǐng)D中的方式建設(shè)在城市周圍,提升城市的等級(jí)。

對(duì)于任意等級(jí)的城市,我們把正方形街區(qū)從左上角開始按照道路標(biāo)號(hào)。

雖然這個(gè)方案很爛,F(xiàn)ractal 規(guī)劃部門的人員還是想知道,如果城市發(fā)展到了等級(jí) ,編號(hào)為 和 的兩個(gè)街區(qū)的直線距離是多少。

街區(qū)的距離指的是街區(qū)的中心點(diǎn)之間的距離,每個(gè)街區(qū)都是邊長(zhǎng)為 米的正方形。

輸入格式

第一行輸入正整數(shù)n ,表示測(cè)試數(shù)據(jù)的數(shù)目。

以下 n行,輸入 n組測(cè)試數(shù)據(jù),每組一行。

每組數(shù)據(jù)包括三個(gè)整數(shù) N,A, B,表示城市等級(jí)以及兩個(gè)街區(qū)的編號(hào),整數(shù)之間用空格隔開。

輸出格式

一共輸出 行數(shù)據(jù),每行對(duì)應(yīng)一組測(cè)試數(shù)據(jù)的輸出結(jié)果,結(jié)果四舍五入到整數(shù)。

數(shù)據(jù)范圍

輸入樣例:

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

輸出樣例:

  1. 10  
  2. 30  
  3. 50  

題解

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

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

  • 我們想計(jì)算 n 等級(jí)的坐標(biāo),知道 n-1 等級(jí)的坐標(biāo)就行

然后思考怎么遞歸?

咱們首先規(guī)定,每個(gè)等級(jí)的坐標(biāo)系原點(diǎn)是獨(dú)特的,如下圖。

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

  • 等級(jí)1這個(gè)塊塊,如果放到等級(jí)2里,有四種情況要討論
  • 等級(jí)1放到等級(jí)2的左上象限,則相當(dāng)于順時(shí)針旋轉(zhuǎn)了 90° ,并且還要沿 y 軸翻轉(zhuǎn)(為什么要沿 y 軸翻轉(zhuǎn)呢?因?yàn)槟阕⒁饷總€(gè)編號(hào)的位置,不翻轉(zhuǎn),形狀雖然對(duì)上了,但是編號(hào)順序沒對(duì)上)
  • 等級(jí)1放到等級(jí)2的右上象限,則不用轉(zhuǎn)
  • 等級(jí)1放到等級(jí)2的右下象限,則不用轉(zhuǎn)
  • 等級(jí)1放到等級(jí)2的左下象限,則相當(dāng)于逆時(shí)針旋轉(zhuǎn)了 90° ,并且還要沿 y 軸翻轉(zhuǎn)

轉(zhuǎn)完了,因?yàn)槲覀儸F(xiàn)在從等級(jí)1到等級(jí)2了,因此坐標(biāo)系原點(diǎn)也移動(dòng)了,所以要在等級(jí)1的原有坐標(biāo)基礎(chǔ)上進(jìn)行平移。

好了,我給你畫個(gè)圖,你就懂了。

然后你再去看代碼。

這里補(bǔ)充一點(diǎn)數(shù)學(xué)知識(shí):

  • 對(duì)于點(diǎn) (x, y) ,沿原點(diǎn)順時(shí)針旋轉(zhuǎn) 90° ,將變?yōu)?(y, -x)
  • 對(duì)于點(diǎn) (x, y) ,沿原點(diǎn)逆時(shí)針旋轉(zhuǎn) 90° ,將變?yōu)?(-y, x)
  • 對(duì)于點(diǎn) (x, y) ,以 y 軸為對(duì)稱軸翻轉(zhuǎn)將變?yōu)?(-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: 等級(jí) 
  14.     * m: 坐標(biāo),從0開始計(jì)數(shù) 
  15.     */ 
  16.     if (n == 0) return {0, 0}; 
  17.     LL len = 1ll << (n - 1);  // 2^{n-1} 本等級(jí)內(nèi)象限的邊長(zhǎng)/2 
  18.     LL cnt = 1ll << (2 * n - 2);  // 4^{n-1} 本等級(jí)內(nèi)象限容量 
  19.     PLL pos = calc(n - 1, m % cnt);  // 上一等級(jí)的坐標(biāo)信息 
  20.     LL x = pos.first, y = pos.second
  21.     int z = m / cnt;  // 處于哪個(gè)象限 
  22.     // 左上象限順轉(zhuǎn)90°(y,-x)沿y對(duì)稱(-y,-x)更換原點(diǎn)(-y-len,-x+len) 
  23.     if (z == 0) 
  24.         return { - y - len, - x + len }; 
  25.     // 右上象限更換原點(diǎn)(x+len,y+len) 
  26.     else if (z == 1) 
  27.         return { x + len, y + len }; 
  28.     // 右下象限更換原點(diǎn)(x+len,y-len) 
  29.     else if (z == 2) 
  30.         return { x + len, y - len }; 
  31.     // 左下象限逆轉(zhuǎn)90°(-y,x)沿y對(duì)稱(y,x)更換原點(diǎn)(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.         // 等級(jí)1中 len 是單位長(zhǎng)度,且表示象限的一半長(zhǎng)即為 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/

 

責(zé)任編輯:武曉燕 來源: Piper蛋窩
相關(guān)推薦

2021-01-21 09:10:29

ECharts柱狀圖大數(shù)據(jù)

2021-01-08 10:32:24

Charts折線圖數(shù)據(jù)可視化

2023-12-06 08:28:44

禮物系統(tǒng)用例圖

2021-06-05 23:51:21

ECharts氣泡圖散點(diǎn)圖

2011-01-10 14:41:26

2011-05-03 15:59:00

黑盒打印機(jī)

2021-07-14 09:00:00

JavaFX開發(fā)應(yīng)用

2020-02-21 19:54:09

HTTPS 配置手把手教

2020-02-21 10:45:06

運(yùn)維架構(gòu)技術(shù)

2021-02-26 11:54:38

MyBatis 插件接口

2011-02-22 13:46:27

微軟SQL.NET

2021-12-28 08:38:26

Linux 中斷喚醒系統(tǒng)Linux 系統(tǒng)

2022-01-08 20:04:20

攔截系統(tǒng)調(diào)用

2023-04-26 12:46:43

DockerSpringKubernetes

2022-12-07 08:42:35

2022-07-27 08:16:22

搜索引擎Lucene

2021-12-02 11:39:28

Git服務(wù)器Linux

2022-03-14 14:47:21

HarmonyOS操作系統(tǒng)鴻蒙

2020-12-07 09:01:58

冪等系統(tǒng)f(f(x)) =f(

2020-04-14 10:20:12

MySQL數(shù)據(jù)庫(kù)死鎖
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)