二叉树中的小球下落

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yky__xukai/article/details/79950294

                                             二叉树中的小球下落

Description

 有一棵满 二叉树,所有结点从上到下,从左到右的编号为1,2,…,2^D-1。在结点1处放一个小球,它会往下落。每个内结点上都有一个开关,初始全部关闭,当每次小球落到一个开关上时,它的状态都会改变。当小球到达一个内结点时,如果 该结点上的开关关闭,则往左走,否则往右走,直到走到叶结点。一些小球从结点1处依次开始下落,最后一个小球将会落到哪里呢?

Input

 输入有若干行,第行2个数据D和n,D是二叉树的深度,n是小球的个数。输入最多1000组。

Ouput

 输出最后个小球落下的叶结点的编号。

Sample Input

4 2

3 4

10 1

2 2

8 128

16 12345

20 524288

Sample Output

12

7

512

3

255

36358

1048575

递归:

#include <iostream>
#include <cmath>
using namespace std;
int Max;
int D,n;
int flag[9999999];
void start(){
	Max =pow(2.0,D*1.0)-1; 
	for(int i=1;i<=Max;i++){
			flag[i] = false;
	}
};
int find(int flag[],int j){	
	if(flag[j]==false){
		flag[j] = true;
		j = 2*j;
		if(j>=(pow(2.0,D*1.0-1))){
			flag[j] = true;
			return j;
		}else{
			find(flag,j);
		}
	}else{
		flag[j] = false;
		j = 2*j+1;
		if(j>=(pow(2.0,D*1.0-1))){
			flag[j] = true;
			return j;
		}else{
			find(flag,j);
		}
	}
};
int main()
{
	int index = 0;
	while(cin>>D>>n){
		start();	
		for(int i=0;i<n;i++){
			index = find(flag,1);
		}
		cout<<index<<endl;
	}
	return 0;
}

迭代:

#include<iostream>
#include<cmath>
using namespace std;
bool tree[1000000];
int main()
{
	int i,j,n,D;
	while(cin>>D>>n)
	{
		memset(tree,false,sizeof(tree));
		for(i=0;i<n;i++)
		{
			j=1;
			int d=D-1;
			while(d--)
			{
				if(tree[j]==false)
				{
					tree[j]=true;
					j=2*j;
				}
				else
				{
					tree[j]=false;
					j=2*j+1;
				}
			}
		}
		cout<<j<<endl;
	}
	return 0;
}

两种运行结果:

 

 

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页