当前位置: 代码迷 >> C语言 >> 只有天才才能做得出来的题
  详细解决方案

只有天才才能做得出来的题

热度:449   发布时间:2008-06-20 22:59:24.0
有点思路了,要从前面几楼的3分法入手...
不过接下情况太多了还真是麻烦,只能一步一步慢慢走了
----------------解决方案--------------------------------------------------------
我不是给出了确定性的设计思路了吗?
孔明的办法,在于由代码本身设计策略,所以我才觉得好玩。
我的办法是由人设计策略,然后使用代码实现。
明白差别了么?
----------------解决方案--------------------------------------------------------
自动推理的会好玩得多


[color=white]
----------------解决方案--------------------------------------------------------
我没看过答案。。
我会把12个球分3份:
第一次:随机取两份,如果是两份一样重,那么异常的是第三份,如果不一样重,那么剩下的一定是正常的。
第二次:通过第二次判断异常的球是重了还是轻了,由第一次情况一定可以判定的;
第三次:取出异常的那四个,一分为2,因为已经判断球是轻是重了,从两边天平重取一个球交换。。如果平衡没有改变,那么就是留下的那个,如果改变了,就是拿走的那个。。
是不是超过要求了?
----------------解决方案--------------------------------------------------------
第二次:通过第二次判断异常的球是重了还是轻了,由第一次情况一定可以判定的;

由第一次,是不能判定的……
----------------解决方案--------------------------------------------------------
我是说,第一次已经可以知道哪组是正常,那组是异常的了,(对于平衡的情况我们知道剩下的是异常,盘子里是正常,第2次比较下就可以了;对于不平衡的那组我们知道剩下的是正常,第2次只要和正常的比较就知道哪个是异常还知道轻了还是重了)只要对比下异常和正常就可以判断异常是轻了还是重了。。不过我好像还是错了。。因为我比较了4次

[[it] 本帖最后由 sunkaidong 于 2008-6-20 23:46 编辑 [/it]]
----------------解决方案--------------------------------------------------------
MS燕子的论坛上有13个球的。

第一次4 V 4  
以后的情况得看前一次称量的结果。。

总之要一大堆的if   else 语句。。。


以下从http://yzfy.org转载:(关于13个球的称法)



题目描述:
有13个外表一模一样的球,编号从1-13,
不过有一个球的质量和其它的球不一样,
并且不知道是轻了还是重了。
现在需要你使用一个天平称三次以内找出来。
程序接口:
猜测函数声明:
int IBalanceBalls(
    int nBalls,    // 你要称多少个球
    int nLBall[],  // 天平左盘要称的球的编号所组成的数组
    int nRBall[]   // 天平右盘要称的球的编号所组成的数组
);
返回值:
1 :右盘重
0 :两边平衡
-1:左盘重

提交函数声明:
int ISubmit(
    int nBallIndex // 质量不一样的球的编号
);
返回值:
0: 无下一测试数据,请退出程序
1: 还有下一组数据,请接着循环

输入:
无输入

输出:
无输出。

样例输入:
无样例

样例输出:
无样例

其它信息:
nLBall和nRBall那两个数据的下标从0至nBalls-1为有效内容
里面的内容是球的编号,注意是从1-13,否则会RE
以上两个函数已预定义,不需要声明便可使用
IBalanceBalls函数调用三次以后必须调用ISubmit函数,否则会出错

难度:Normal


#define PB_ID 88
int noEnd =1;
int Search8(int n, int heavy[], int light[], int rest[])
{
    int a[3] = {heavy[0], heavy[1], rest[0]};
    int b[3] = {heavy[2], heavy[3], light[0]};
    int temp =IBalanceBalls(3, a, b);
    if( 0 ==temp)
    {
        if( 0 ==(temp =IBalanceBalls(1, light+1, light+2)))
            noEnd = ISubmit(light[3]);
        else if( -1 ==temp )
            noEnd = ISubmit(light[2]);
        else
            noEnd = ISubmit(light[1]);
    }
    else if(-1 == temp)
    {
        if( 0 == (temp =IBalanceBalls(1, heavy, heavy+1)))
            noEnd = ISubmit(light[0]);
        else if( -1 == temp)
            noEnd = ISubmit(heavy[0]);
        else
            noEnd =ISubmit(heavy[1]);
    }
    else
    {
        if( -1 ==IBalanceBalls(1, heavy+2, heavy+3))
            noEnd = ISubmit(heavy[2]);
        else
            noEnd = ISubmit(heavy[3]);        
    }
    return 0;
}

int main()
{
    while( noEnd)
    {
        int lBalls[4] = {1,2,3,4};
        int rBalls[4] = {5,6,7,8};
        int rest[5] = {9,10,11,12,13};
        int n;
        if(0 ==(n=IBalanceBalls(4, lBalls, rBalls)))
        {
            if(0 ==(n=IBalanceBalls(3, lBalls, rest)))
            {
                if( 0 ==(n= IBalanceBalls(1,lBalls, rest+3)))
                    noEnd =ISubmit(rest[4]);
                else
                    noEnd =ISubmit(rest[3]);
            }
            else if( -1 == n)
            {
                if( 0 ==(n = IBalanceBalls(1,rest,rest+1)))
                    noEnd =ISubmit(rest[2]);
                else if(-1 == n)
                    noEnd = ISubmit(rest[1]);
                else
                    noEnd = ISubmit(rest[0]);
            }
            else
            {
                if( 0 ==(n = IBalanceBalls(1,rest,rest+1)))
                    noEnd = ISubmit(rest[2]);
                else if(-1 == n)
                    noEnd =ISubmit(rest[0]);
                else
                    noEnd = ISubmit(rest[1]);
            }
        }
        else if(-1 ==n)
            Search8(4,lBalls, rBalls, rest);
        else
            Search8(4,rBalls,lBalls, rest);
    }
    return 0;
}


1、其中关于IBalanceBalls函数我想是关于两边球的质量和的比较,这个比较简单。。。可以自己写。
   但是我对于函数调用次数怎么统计不清楚,请高手给我个实例。。谢谢!
2、ISubmit就更简单了,一个判断加return,也可以加上一个输出。

我是新手,如有不对,请指正。。

望有高手帮我解决函数调用次数的统计问题。。

[[it] 本帖最后由 himpo 于 2008-6-21 08:35 编辑 [/it]]
----------------解决方案--------------------------------------------------------
这道题目我记得有一年有个论文用了叫做“三进代码”的算法,好像比传统算法快不少。
----------------解决方案--------------------------------------------------------
[bo][un]reebokjyn[/un] 在 2008-6-20 22:39 的发言:[/bo]

我也来灌水   
一个二分法就好了,第一次6:6,排除6个,第二次3:3,排除3个,最后一次从3个中取出2个,1:1,如果取出的两个一样重就是第三个。大概就是这样吧。20秒就想好了,果然是标题党,我这样的人都能马上想出 ...


如果取出来的不一样重呢???你的想法不够严谨,二分法绝对不行!!!
----------------解决方案--------------------------------------------------------
半个小时做出来的人确实是天才,前提是真正靠自己的智慧。

靠见多识广做出来也值得肯定,但不能骄傲,毕竟具有创造力的人是极少的
----------------解决方案--------------------------------------------------------
  相关解决方案