小猴子下落問題(二叉樹)

2021-10-05 11:04:14 字數 1437 閱讀 7525

時間限制:3000 ms | 記憶體限制:65535 kb 難度:3

描述

有一顆二叉樹,最大深度為d,且所有葉子的深度都相同。所有結點從左到右從上到下的編號為1,2,3,·····,2的d次方減1。在結點1處放乙個小猴子,它會往下跑。每個內結點上都有乙個開關,初始全部關閉,當每次有小猴子跑到乙個開關上時,它的狀態都會改變,當到達乙個內結點時,如果開關關閉,小猴子往左走,否則往右走,直到走到葉子結點。

一些小猴子從結點1處開始往下跑,最後乙個小猴兒會跑到**呢?

輸入

輸入二叉樹葉子的深度d,和小猴子數目i,假設i不超過整棵樹的葉子個數,d<=20.最終以 0 0 結尾

輸出

輸出第i個小猴子所在的葉子編號。

樣例輸入:

4 2

3 40 0

樣例輸出:

12

7

解析:

#include

#include

#include

using

namespace std;

intmain()

int res=1;

//記錄猴子的最終位置

int sum=

pow(

2,d)

;//記錄節點的總數

memset

(isvisited,

0,sum*

sizeof

(int))

;for

(int i=

1;i<=i;i++

)//依次落入小猴子

else

tmp=

2*tmp;

}else

else

tmp=

2*tmp+1;

}}} cout<}return0;

}

tips:

自己畫一下完全二叉樹就知道了,節點的編號是很緊湊的,可以填充好乙個陣列。

判斷條件是一旦計算的下乙個節點超出二叉樹頂點數,就結束,輸出當前節點。

由於最多有20層的數,近100萬元素的陣列,記憶體消耗太大了。記憶體消耗較小的方法是,不用設定標記陣列去判斷。

#include

using

namespace std;

intmain()

else

} cout << res << endl;

}}

nyoj 63 小猴子下落 二叉樹

根據右圖測試資料可知,一共有n行 3,4,5 x個猴子中每2 n出現一迴圈,理由就是它是滿二叉樹。根據左圖四層我們列出資料看看 第1只猴子12 48第2只猴子13 612第3只猴子12 510第4只猴子13 714第5只猴子12 49第6只猴子13 613第7只猴子12 511第8只猴子13 715...

XYNUOJ1843 小猴子下落 二叉樹

時間限制 3 sec 記憶體限制 64 mb 提交 55 解決 44 您該題的狀態 已完成 提交 狀態 討論版 題目描述 有一顆二叉樹,最大深度為d,且所有葉子的深度都相同。所有結點從左到右從上到下的編號為1,2,3,2的d次方減1。在結點1處放乙個小猴子,它會往下跑。每個內結點上都有乙個開關,初始...

NYOJ63 小猴子下落 二叉樹性質

有一顆二叉樹,最大深度為d,且所有葉子的深度都相同。所有結點從左到右從上到下的編號為1,2,3,2的d次方減1。在結點1處放乙個小猴子,它會往下跑。每個內結點上都有乙個開關,初始全部關閉,當每次有小猴子跑到乙個開關上時,它的狀態都會改變,當到達乙個內結點時,如果開關關閉,小猴子往左走,否則往右走,直...