| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2454 人关注过本帖, 1 人收藏
标题:acm,小猴子下落的问题,
取消只看楼主 加入收藏
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
结帖率:95.37%
收藏(1)
已结贴  问题点数:20 回复次数:6 
acm,小猴子下落的问题,
有一颗二叉树,最大深度为D,且所有叶子的深度都相同。所有结点从左到右从上到下的编号为1,2,3,·····,2的D次方减1。在结点1处放一个小猴子,它会往下跑。每个内结点上都有一个开关,初始全部关闭,当每次有小猴子跑到一个开关上时,它的状态都会改变,当到达一个内结点时,如果开关关闭,小猴子往左走,否则往右走,直到走到叶子结点。

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

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



#include <stdio.h>
#include <math.h>
#include <string.h>
int main()
{
    int m,n,i;
    int max=pow(20,2)-1;
    int a[max];
    scanf("%d%d",&m,&n);
    while(m!=0&&n!=0)
    {
        memset(a,0,sizeof(int)*m);                //先把数组置位0,
        for(i=1;i<=n;)
        {
            while((2*i<m)||((2*i+1)<m))            //当没走到叶子结点时
            {
                 if(a[i]==0)                        //如果a[i]没走过,
                {
                    a[i]=1;                        //a[i]置位1,说明a[i]已走过
                    i=2*i;                        //走向做孩子。
                }
                else if(a[i]==1)                //如果走过
                {
                    i=2*i+1;                    //走向右孩子
                    a[i]=1;                        //a[i]置位1,说明a[i]已走过
                }
            }
            printf("%d\n",i);                    //输出最后的位置。
            scanf("%d%d",&m,&n);
        }
    }
    return 0;
}

不知道哪考虑错了,请各位指教。
可能是逻辑错了。        
搜索更多相关主题的帖子: 猴子 叶子 结点 开关 int 
2017-12-11 15:04
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
收藏
得分:0 
回复 5楼 九转星河
好的 谢谢。
2017-12-11 21:18
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
收藏
得分:0 
回复 4楼 Alien_Lee
谢谢、
2017-12-11 21:18
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
收藏
得分:0 
http://blog.
2017-12-11 22:02
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
收藏
得分:0 
回复 9楼 九转星河
不太会用位运算,在什么地方用它比较合适呢?
2017-12-12 11:17
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
收藏
得分:0 
回复 12楼 九转星河
谢谢啦,我感觉三楼的代码的健壮性已经很不错了。
这个两次取非代表什么意思呢?
s=!!(i&m)<<n|s>>1;
2017-12-12 23:13
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
收藏
得分:0 
回复 14楼 九转星河
好的谢啦
2017-12-13 12:41
快速回复:acm,小猴子下落的问题,
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017690 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved