小球下落
有一棵二叉树,最大的深度为D,所有叶子的深度都相同,所有节点从上到下从左到右的编号为 1,2,3,4....2^(D-1)
在节点1处放一个小球,它会往下落,每个内节点上都有一个开关,初始化的时候都是关着的,当每次有小球落到一个开关的时候,它的状态就会变化
当小球到达一个内节点的时候,如果开关是关闭的,就往左走,否则就往右走,直到走到叶子节点。
输入 D I
D表示二叉树的深度,在输入I表示第几个小球
(D <= 20 输入最多包含1000组数据);
输出
第I个小球最后落入的叶子节点数目。
分析: 本质 -> 二叉树
知识:
结点的度:一个结点拥有子树的数目称为结点的度
树的度:树中所有结点的度的最大值
叶子结点:也称为终端结点,没有子树的结点或者度为零的结点
二叉树的性质:
1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 const int maxn = 20; 5 int s[1<<maxn]; 6 int main(){ 7 int D,I,k; 8 while(scanf("%d %d",&D,&I)==2){ 9 memset(s,0,sizeof(s)); 10 int n=(1<<D)-1; // n为最大结点编号 11 for(int i=0;i<I;i++){ // I个小球下落 12 k=1; 13 while(1){ 14 s[k] = !s[k]; 15 k = s[k] ? k*2 : k*2+1; 16 if(k > n) break; 17 } 18 } 19 printf("%d\n",k/2); 20 } 21 }
原文:https://www.cnblogs.com/religious-chen/p/15311188.html