不过接下情况太多了还真是麻烦,只能一步一步慢慢走了
----------------解决方案--------------------------------------------------------
我不是给出了确定性的设计思路了吗?
孔明的办法,在于由代码本身设计策略,所以我才觉得好玩。
我的办法是由人设计策略,然后使用代码实现。
明白差别了么?
----------------解决方案--------------------------------------------------------
自动推理的会好玩得多
[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秒就想好了,果然是标题党,我这样的人都能马上想出 ...
我也来灌水
一个二分法就好了,第一次6:6,排除6个,第二次3:3,排除3个,最后一次从3个中取出2个,1:1,如果取出的两个一样重就是第三个。大概就是这样吧。20秒就想好了,果然是标题党,我这样的人都能马上想出 ...
如果取出来的不一样重呢???你的想法不够严谨,二分法绝对不行!!!
----------------解决方案--------------------------------------------------------
半个小时做出来的人确实是天才,前提是真正靠自己的智慧。
靠见多识广做出来也值得肯定,但不能骄傲,毕竟具有创造力的人是极少的
----------------解决方案--------------------------------------------------------