一些小球從結點1處依次開始下落,最後一個小球將會落到哪裏呢?輸入葉子深度D和小球個數I,輸出第I個小球最後所在的葉子編號。假設I不超過整棵樹的葉子個數(即2^(D-1))。D<=20。輸入最多包含1000組數據。
樣例輸入:
4 2
3 4
10 1
2 2
8 128
16 12345
樣例輸出:
12
7
512
3
255
36358
#include<stdio.h>
#include<string.h>
#include<math.h>
#define SIZE 1000
typedef struct node{
int data;
int type;
}Node;
Node a[SIZE];
int main () {
int D, I;
int i, j;
// scanf("%d%d", &D, &I);
D = 4;
I = 2;
memset(a, 0, sizeof(a));
int len = (int)pow(2,D) - 1; //深度爲k的樹至多有2^k-1個節點
for(i = 1; i <= len; i ++){
a[i].data = i;
}
int k;
for(i = 0; i < I; i ++){ //I個小球循環
k = 1;
for(j = 0; j < D-1; j ++){ //深度爲D的數需要移動D-1次
if(a[k].type == 0){
a[k].type = 1;
k = 2 * k;
} else {
a[k].type = 0;
k = 2 * k + 1;
}
}
}
printf("%d", k);
return 0;
}