`
Simone_chou
  • 浏览: 192918 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

小猴子下落(二叉树 or 模拟)

    博客分类:
  • NYOJ
 
阅读更多

小猴子下落

时间限制:3000 ms  |  内存限制:65535 KB
难度:3
 
描述

有一颗二叉树,最大深度为D,且所有叶子的深度都相同。所有结点从左到右从上到下的编号为1,2,3,·····,2的D次方减1。在结点1处放一个小猴子,它会往下跑。每个内结点上都有一个开关,初始全部关闭,当每次有小猴子跑到一个开关上时,它的状态都会改变,当到达一个内结点时,如果开关关闭,小猴子往左走,否则往右走,直到走到叶子结点。

一些小猴子从结点1处开始往下跑,最后一个小猴儿会跑到哪里呢?

 
输入
输入二叉树叶子的深度D,和小猴子数目I,假设I不超过整棵树的叶子个数,D<=20.最终以 0 0 结尾
输出
输出第I个小猴子所在的叶子编号。
样例输入
4 2
3 4
0 0
样例输出
12
7

 

   题意:

   从根数1开始往下落,初始状态全为0,每经过一次就改变一次状态,0则到左儿子处,1则到右儿子处,输出最后一次下落后所在位置。

 

   思路:

   二叉树的简单应用,帮助理解二叉树。模拟一下猴子下落过程即可。

 

    AC:

#include<stdio.h>
#include<string.h>
#include<math.h>
int a[1500000];
int main()
{
	int n,m;
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		int i,j;
		if(!n&&!m) break;
		memset(a,0,sizeof(a));
//初始设为0,表全关
		for(i=1;i<=m;i++)
		{
			j=1;
			while(j<pow(2,n-1))
			{
				if(a[j]==1)  
				{
				 a[j]=0;
				 j=2*j+1;
				}
//往右儿子走
				else 
				{
		                 a[j]=1;
				 j=2*j;
			        }
//往左儿子走
			}
		}
		printf("%d\n",j);
	}
	return 0;
}

 还有一种更简单的方法AC:

 

上面的方法虽然简单易懂,但是运算量太大了,所以可以直接模拟最后一只猴子的下落路线。

从序号的奇偶性来观察,从节点1开始,如果这个序号R是奇数的话,则往左走,也就是说它是在节点1往左走的第(R+1)/2只猴子,如果是偶数的话,则往右走,它是在节点1往右走的第R/2只猴子。

这样看来,只需要看猴子编号的奇偶性,就可以知道它最终落在哪里了,当它落在某一位置时,只需要知道它是第几个落在这个位置,就知道它往左走还是右走了。

比如:

有1号,2号,3号,4号,5号共5只猴子,一共有3层数,则:

1      
2   3  
4 5 6 7

第一层:1号是第1只猴子在第一层1这个位置上,则他会往左走到第二层2的位置上;2号是第2只猴子在第一层1这个位置上,则他会往右走到第二层3的位置上…………

第二层:1号是第1((1+m)/2)只猴子在第二层2这个位置上,3号是第2((1+m)/2)只……2号是第1(m/2)只猴子在第二层2这个位置上,4号是第2(m/2)只……

依次类推,把关注的对象从本身的序号变为第N只落在某一位置上来加以判断。

 

#include<stdio.h>
int main()
{
	int n,m;
	while(scanf("%d%d",&n,&m)!=EOF&&(n+m))
	{
		int i,pos=1;
		for(i=1;i<n;i++)
//循环层数
		{
			if(m%2) {pos=pos*2;m=(m+1)/2;}
//在这个位置是奇数,往左走,序号变化
			else    {pos=pos*2+1;m=m/2;}
//偶数,往右走,序号变化
		}
		printf("%d\n",pos);
	}
	return 0;
}

   总结:

 

   模拟也需要有技巧。

分享到:
评论

相关推荐

    C/C++:小球下落问题求解.rar(含完整注释)

    给定一棵深度为 depth 的满二叉树,并对该二叉树从根结点开始自上而下,每一层从左到右, 从 1 开始进行编号,则结点的编号序列就是 1,2,3,…,2depth-1。如下图给出的深度为 4 的满二叉树。 现在在结点 1 处放一个...

    二叉树模拟器.py二叉树模拟器.py

    二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py...模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟

    编程学C#(3):动态模拟创建二叉树程序

    在本篇中,我们将深入探讨如何使用C#编程语言动态模拟创建二叉树,并通过VS2010集成开发环境实现二叉树的图形显示。二叉树是一种基础且重要的数据结构,在计算机科学中有着广泛的应用,如搜索、排序、文件系统等。C#...

    二叉树---数据结构

    二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树

    二叉树演示 实现二叉树图形显示

    二叉树是一种特殊的树结构,每个节点最多只有两个子节点,通常分为左子节点和右子节点。在计算机科学中,二叉树被广泛应用于数据的组织和操作,如搜索、排序、文件系统等。本例子关注的是如何实现二叉树的图形显示,...

    画二叉树小工具dtree源码

    【标题】"画二叉树小工具dtree源码"涉及的是一个用于绘制二叉树图形的编程工具,它的核心是通过源代码实现对二叉树结构的可视化展示。二叉树是一种重要的数据结构,广泛应用于计算机科学的多个领域,如搜索、排序、...

    根据后序二叉树序列构造二叉树_扩展二叉树

    在计算机科学领域,二叉树是一种基础的数据结构,它由结点构成,每个结点最多有两个子节点,分别称为左子节点和右子节点。在众多的二叉树操作中,根据后序遍历序列(也称为后序序列)来构造二叉树是一项常见的任务。...

    二叉树建立 二叉树基本算法的实现

    (2)先序、中序、后序遍历二叉树:递归算法。 (3)中序遍历二叉树:非递归算法(最好也能实现先序,后序非递归算法)。 (4)求二叉树的高度 。 (5)求二叉树的叶子个数。 (6)对于树中每一个元素值为x的结点...

    判断二叉树是否是完全二叉树

    编写算法判别给定二叉树是否为完全二叉树。

    二叉树基本操作的程序实现

    二叉树基本操作的程序实现 二叉树是一种基础的数据结构,它广泛应用于计算机科学和软件工程领域。二叉树的基本操作包括建立二叉树、前序遍历、中序遍历、后序遍历等。这些操作是二叉树的基础,掌握这些操作是学习和...

    判断二叉树是否为完全二叉树

    在二叉树类binarytree中增加一个功能,判断是否为完全二叉树(使用自定义的队列类完成)

    基于C++实现(WinForm)二叉树及模拟社会关系网络【100010542】

    采用开发平台为 Qt Creator ...完成实现类(二叉树)的设计与实现。包括先序、中序、后序遍历;先序、中序、后序线索化;统计叶子结点个数。 设计显示图形,并将图形与二叉树进行映射。 进行整体调试与容错性检测。

    构造二叉树与遍历二叉树

    ### 构造二叉树与遍历二叉树 #### 一、二叉树的基本概念 二叉树(Binary Tree)是一种非线性数据结构,在计算机科学中被广泛应用于各种算法和程序设计中。一个二叉树由零个或多个节点组成,其中每个节点最多有两个子...

    将满二叉树转化为求和二叉树_二叉树_

    在IT领域,特别是数据结构和算法的学习中,二叉树是一种重要的抽象数据类型。满二叉树是一种特殊的二叉树,其中每一层都是完全填充的,除了可能的最后一层,且最后一层的所有节点都尽可能地向左靠拢。而将满二叉树...

    易语言二叉树遍历

    在易语言中,你可以创建一个简单的二叉树来模拟这些场景,并使用提供的源码作为参考。 综上所述,易语言二叉树遍历涉及到了数据结构、递归算法、内存操作等核心编程概念,掌握这些技能对于提升编程能力大有裨益。...

    二叉树树形输出

    本代码实现了将一个给定的二叉树以图形化的形式输出到控制台的功能,即通过字符来模拟二叉树的形状。这种可视化方法有助于更好地理解和分析二叉树的结构。 #### 三、二叉树创建与遍历 - **二叉树创建**:程序首先...

    复制一棵二叉树

    ### 知识点:复制一棵二叉树 #### 一、引言 在计算机科学领域,数据结构中的二叉树是一种常见的非线性数据结构,它由节点组成,每个节点最多有两个子节点,分别称为左子节点和右子节点。复制二叉树是指创建一个与原...

    二叉树,简单的二叉树范例程序

    二叉树是计算机科学中一种重要的数据结构,它在很多算法和问题解决中都有广泛应用。在数据结构课程中,学习二叉树可以帮助我们理解和掌握如何有效地存储和处理数据。在这个"二叉树,简单的二叉树范例程序"中,作者...

    中序线索二叉树(建立二叉树,线索化,输出二叉树)

    中序线索二叉树(建立二叉树,线索化,输出二叉树)

    按凹入表形式横向打印任意二叉树结构,即二叉树的根在屏幕的最左边,二叉树的左子树在屏幕的下边,二叉树的右子树在屏幕的上边。

    二叉树横向打印算法的实现 二叉树是一种基本的数据结构,在计算机科学和编程中广泛应用。本资源介绍了一种特殊的二叉树打印算法,即横向打印二叉树结构。该算法将二叉树的根节点放在屏幕的最左边,左子树在屏幕的...

Global site tag (gtag.js) - Google Analytics