NYOJ水题题解-63小猴子下落(memset,三目运算符,左移运算符 )

题目:

时间限制: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


分析:使用结构体建二叉树的方式是一定超时的,于是学会了了点击打开链接 的代码。

我的代码(和链接中的差不多)

#include<iostream>
#include<string.h>
using namespace std;
bool open[1 << 20];
int main()
{
	int D, I, len;
	int i, k;
	while (cin >> D >> I)
	{
		if (!D && !I)break;
		//init
		memset(open, 0, sizeof(open));
		len = (1 << D) - 1;
		//judge
		for (i = 0; i < I; i++)
		{
			k = 1;
			while (k <= len)//模拟下树过程
			{
				open[k] = !open[k];
				k = open[k] ? (2 * k) : (2 * k + 1);//开往左,关往右
			}
		}
		cout << k / 2 << endl;//输出越界前的k值
	}
	return 0;
}


其中涉及的知识点:

1. 1<<20

<<左移运算符,百度百科里<<_百度百科 有包括>>右移运算符的解释。

也不需要看懂,总之a<<b = a * pow(2,b)     a>>b = a / pow(2,b)这样记忆就行。


2.memset()

百度百科里面的解释比较清楚:memset_百度百科

【void *memset(void *s, int ch, size_t n);
函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。】

使用时第一个参数为要清零的东西,一般是数组,第二个为0(NULL),第三个就是要清零的东西的size多少。

头文件<memory.h>或<string.h>


3.三目运算符

?:   差点忘记了,<表达式1>?<表达式2>:<表达式3>; "?"运算符的含义是: 先求表达式1的值, 如果为真, 则执行表达式2,并返回表达式2的结果 ; 如果表达式1的值为假, 则执行表达式3 ,并返回表达式3的结果。




发布了48 篇原创文章 · 获赞 21 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/qq_33810513/article/details/52081552