題目63 猴子下落

2021-06-20 13:12:52 字數 1537 閱讀 3345

描述

有一顆二叉樹,最大深度為

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

using namespace std;

int main(void)

cout<<"請輸入樹的深度和猴子的個數(猴子個數小於樹的深度):";

int depth,count;

cin>>depth>>count;

int num=1;

for(int i=1;iif(count%2==0)   //偶數

num=num*2+1; //右子樹

else

num=num*2; //奇數 左子樹

if(count==2)

count/=2;

else if(count==1)

else

count=ceil(count/2.0);  //向上取整 用2和2.0的區別

cout通過簡單的圖形模擬,我們可以看出規律:奇數向左,偶數向右。例如:輸入的是4 3,

那麼在第一層時,3是位於奇數的位數(3),則向左;

然後到了第二層,進入第二層左的只有1 和 3,所以,在這裡,3位於偶數的位置(2),則向右;

然後到了第三層,進入第三層右的只有3 所以,在這裡,3位於奇數的位置(1),則向左,到此結束。

再例如:輸入的是3 4

那麼在第一層的時,4是位於偶數的位置(4),則向右;

然後到了第二層,進入第二層的右的只有2和4,所以,在這裡,4位於偶數的位置(2),則向右;

然後到了第三層,進入第三層右的只有4,所以,在這裡,4位於奇數的位置(1),則向左,到此結束。

從以上示例可以看出,迴圈的次數就是樹的深度減一;

初始的想法是建立一棵完整的二叉樹,但是後來發現,只要用一維陣列模擬二叉樹,然後運用乙個法則:左子結點和其父母結點的關係是2*n;右子結點和其父母結點的關係是2*n+1.

但是這裡最大的問題就是對於乙個數字當前所處位置是屬於偶數字置還是奇數字置的判斷:取當前值的一半,然後再向上取整的數…

NYOJ 63 小猴子下落

時間限制 3000 ms 記憶體限制 65535 kb 難度 3 描述 有一顆二叉樹,最大深度為d,且所有葉子的深度都相同。所有結點從左到右從上到下的編號為1,2,3,2的d次方減1。在結點1處放乙個小猴子,它會往下跑。每個內結點上都有乙個開關,初始全部關閉,當每次有小猴子跑到乙個開關上時,它的狀態...

NYOJ 63 小猴子下落

時間限制 3000 ms 記憶體限制 65535 kb 難度 3 描述 有一顆二叉樹,最大深度為d,且所有葉子的深度都相同。所有結點從左到右從上到下的編號為1,2,3,2的d次方減1。在結點1處放乙個小猴子,它會往下跑。每個內結點上都有乙個開關,初始全部關閉,當每次有小猴子跑到乙個開關上時,它的狀態...

NYOJ 63 小猴子下落

時間限制 3000 ms 記憶體限制 65535 kb 難度 3 描述 有一顆二叉樹,最大深度為d,且所有葉子的深度都相同。所有結點從左到右從上到下的編號為1,2,3,2的d次方減1。在結點1處放乙個小猴子,它會往下跑。每個內結點上都有乙個開關,初始全部關閉,當每次有小猴子跑到乙個開關上時,它的狀態...