12个球,有一个不同(不知是轻是重),称3次找出那个球

本文介绍了一道经典的逻辑谜题解决方案:如何通过三次使用天平找出12个球中唯一一个重量不同的球,并详细解释了每一步骤背后的逻辑。

一道微软的面试题:12个球一个天平,现知道只有一个和其它的重量不同,问怎样称才能用三次就找到那个球? 

答案:一

①②③④‖⑤⑥⑦⑧
ⅰ、①②③④=⑤⑥⑦⑧ →次品在⑨⑩⑾⑿中,①②③④⑤⑥⑦⑧为标准球,记●
⑨⑩⑾‖●●●
一、⑨⑩⑾=●●● →次品为⑿
二、⑨⑩⑾>●●● →次品在⑨⑩⑾中,而且次品为重。
⑨‖⑩
⒈⑨=⑩ →次品为⑾
⒉⑨>⑩ →次品为⑨
⒊⑨<⑩ →次品为⑩
三、⑨⑩⑾<●●● →次品在⑨⑩⑾中,而且次品为轻。
⑨‖⑩
⒈⑨=⑩ →次品为⑾
⒉⑨>⑩ →次品为⑩
⒊⑨<⑩ →次品为⑨
ⅱ、①②③④>⑤⑥⑦⑧ →次品在①②③④⑤⑥⑦⑧中,⑨⑩⑾⑿为标准球,记●
①②③⑤⑥‖④●●●●
一、①②③⑤⑥=④●●●● →次品在⑦⑧中,而且次品为轻。
⑦‖●
⒈⑦=● →次品为⑧
⒉⑦<● →次品为⑦
⒊不可能出现⑦>●
二、①②③⑤⑥>④●●●● →次品在①②③中,而且次品为重。
①‖②
⒈①=② →次品为③
⒉①<② →次品为②
⒊①>② →次品为①
三、①②③⑤⑥<④●●●● →次品在⑤(轻)⑥(轻)或④(重)中
④⑤‖●●
⒈④⑤=●● →次品为⑥
⒉④⑤<●● →次品为⑤
⒊④⑤>●● →次品为④
ⅲ、①②③④>⑤⑥⑦⑧情况同ⅱ。
(①②③④号码改为⑤⑥⑦⑧,⑤⑥⑦⑧号码改为①②③④,推理同ⅱ)
注:‖为天平称称量。ⅰⅱⅲ为第一次称量情况分支,一二三为第二次称量情况分支⒈⒉⒊为第三次称量情况分支。标准球记●


答案:二

把12个球编成1,2......12号,则可设计下面的称法:

左盘 *** 右盘

第一次 1,5,6,12 *** 2,3,7,11

第二次 2,4,6,10 *** 1,3,8,12

第三次 3,4,5,11 *** 1,2,9,10

每次都可能有平、左重、右重三种结果,搭配起来共有27种结果,但平、平、平的结果不会出现,因为总有一个球是不相等的。同样左、左、左,右、右、右的结果也不回出现,因为根据设计的称法,没有一个球是三次都在左边或右边的。剩下的24种结果就可以判断出哪种情况是哪一个球了。例如:如果结果是平、平、左或是平、平、右,就可判断出是9号球,因为第一次与第二次都没有9号球,唯独第三次有9号球,而第一次与第二次都是平的,只有第三次是失衡的,说明9号球的重量与其它的球不同。可依据此原理判断出其它的各种情况分别是哪个球。

有12个球,而坏球又可能比好球轻也可能比好球重,所以总共有12x2=24种可能,24可能结果如下表:
************ ********** ************ **********
* 可 能 * -* 结 果 * * 可 能 *-* 结 果 *
************ ********** ************ **********
1号球,且重 -左、右、右 1号球,且轻 -右、左、左
2号球,且重 -右、左、右 2号球,且轻 -左、右、左
3号球,且重 -右、右、左 3号球,且轻 -左、左、右
4号球,且重 -平、左、左 4号球,且轻 -平、右、右
5号球,且重 -左、平、左 5号球,且轻 -右、平、右
6号球,且重 -左、左、平 6号球,且轻 -右、右、平
7号球,且重 -右、平、平 7号球,且轻 -左、平、平
8号球,且重 -平、右、平 8号球,且轻 -平、左、平
9号球,且重 -平、平、右 9号球,且轻 -平、平、左
10号球,且重-平、左、右 10号球,且轻-平、右、左
11号球,且重-右、平、左 11号球,且轻-左、右、平
12号球,且重-左、右、平 12号球,且轻-左、右、平

上面的24种结果里面没有一个重复的,也可以把上面的结果反过来当成可能,也可唯一的推出那个球为坏球,证明此方法可行。

要找到8个小中的一个品,且不知道它是还是,最少需要3量。可以采用组策略来进行。以下是步骤: 1. 第一:将8个小成三组,每组3个,两组放在天平两端,剩下一组做为备用。 - 如果天平平衡,则品在未量的那3里。 - 如果天平平衡,则品在较或较的那一端。 2. 第二:从第一结果的3中,任选两个放在天平两端。 - 如果平衡,则品是未的那个。 - 若平衡,则已知品是较或较3. 第三次:取第二确定的(如果有两个待测),与剩余任意一个一起量。 - 如果平衡,未的是品;若平衡,已知哪一个品。 以下是基于以上算法的C语言代码示例: ```c #include <stdio.h> int main() { int balls[8] = {1, 1, 1, 0, 0, 0, 0, 0}; // 假设0代表正品,1代表品,未知 int index = 7; // 初始假定最后一个品 int steps = 0; printf("步骤1: 3组...\n"); for (steps = 0; steps < 2 && index > 2; steps++) { int group1[] = {balls[index - 3], balls[index - 2], balls[index - 1]}; int group2[] = {balls[0], balls[1], balls[2]}; if (compareWeights(group1, group2) == 0) { index -= 3; } else { break; } } if (index > 2) { printf("步骤2: 再成两组...\n"); int group1[] = {balls[index - 3], balls[index - 2]}; int group2[] = {balls[index - 1]}; if (compareWeights(group1, group2) == 0) { index--; } else { printf("步骤3: 最后一量...\n"); printf("品是第 %d 个。\n", index); } } else { printf("步骤3: 品是未的第 %d 个。\n", index); } return 0; } // 模拟比较重量,这里假设数组元素的值为0代表正常,1代表异常 int compareWeights(int* group1, int* group2) { // 实际操作中需要替换为实际的过程,这里仅作为模拟 // 这里假设如果所有都是1则返回1,否则返回0 return group1[0] + group1[1] + group1[2] != group2[0] + group2[1] + group2[2]; } ``` 注意这只是一个简单的模拟,实际应用中天平的比较函数`compareWeights`需要根据具体的硬件实现来编写。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值