算法競賽入門經典_6數據結構基礎

* 6.3  樹和二叉樹

** 小球下落問題 

//小球下落問題
/*
    有一棵二叉樹,最大深度爲D,且所有葉子的深度相同.所有節點從上到下從左到右
    編號爲1,2,3,4,...,2^D-1.
    在節點1處放一小球,它會往下落.每個內節點上都有一個開關,初始全部關閉,當每次有
    有小球落在開關上是,狀態都會改變.當小球到達一個內節點時,如果該節點上的開關關閉,
    則往左走,否則往右走,直到走到葉子結點.
    
    一些小球從結點1處依次開始下落,最後一個小球會落到哪裏呢?
    輸入:     葉子深度D和小球個數I
    輸出:     第I個小球最後所在葉子的編號 

*/ 
#include<cstdio>
#include<cstring>
const int maxd = 20;
int s[1<<maxd]; //最大結點個數爲2^maxd - 1
int main(){
    int D, I;
    while(scanf("%d%d", &D, &I) == 2){
        memset(s, 0, sizeof(s)); //開關 
        int k, n = (1<<D)-1; //n是最大結點編號
        for(int i = 0; i < I; i++){ //連續讓I個小球下落 
            k = 1;
            for(;;){
                s[k] = !s[k];
                k = s[k]?k*2:k*2+1; //根據開關選擇下落方向 
                if(k > n) break; //已經落出界了 
            }
        } 
        printf("%d\n", k/2); //出界之前的編號 
    }
    return 0; 
} 

運行結果:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章