小球称重问题

一、问题描述

十二个小球进行称重,只能称三次,找出不一样的小球,并判断异球的轻重。

二、问题分析

将12个小球分成三组,将小球分别标号为1到12,分组情况如下:

  A组小球:1,2,3,4;

  B组小球:5,6,7,8;

  C组小球:9,10,11,12

情况分析:每个小球都有两种可能,一共会有24种判断结果。

三、算法分析

 

第一次,先将1-4号放在左边,5-8号放在右边。
  1.如果右重则坏球在1-8号。
    第二次将2-4号拿掉,将6-8号从右边移到左边,把9-11号放
    在右边。就是说,把1,6,7,8放在左边,5,9,10,11放在右边。
      1.如果右重则坏球在没有被触动的1,5号。如果是1号,
       则它比标准球轻;如果是5号,则它比标准球重。
        第三次将1号放在左边,2号放在右边。
          1.如果右重则1号是坏球且比标准球轻;
          2.如果平衡则5号是坏球且比标准球重;
          3.这次不可能左重。
      2.如果平衡则坏球在被拿掉的2-4号,且比标准球轻。
        第三次将2号放在左边,3号放在右边。
          1.如果右重则2号是坏球且比标准球轻;
          2.如果平衡则4号是坏球且比标准球轻;
          3.如果左重则3号是坏球且比标准球轻。
      3.如果左重则坏球在拿到左边的6-8号,且比标准球重。
        第三次将6号放在左边,7号放在右边。
          1.如果右重则7号是坏球且比标准球重;
          2.如果平衡则8号是坏球且比标准球重;
          3.如果左重则6号是坏球且比标准球重。
  2.如果天平平衡,则坏球在9-12号。
    第二次将1-3号放在左边,9-11号放在右边。
      1.如果右重则坏球在9-11号且坏球较重。
        第三次将9号放在左边,10号放在右边。
          1.如果右重则10号是坏球且比标准球重;
          2.如果平衡则11号是坏球且比标准球重;
          3.如果左重则9号是坏球且比标准球重。
      2.如果平衡则坏球为12号。
        第三次将1号放在左边,12号放在右边。
          1.如果右重则12号是坏球且比标准球重;
          2.这次不可能平衡;
          3.如果左重则12号是坏球且比标准球轻。
      3.如果左重则坏球在9-11号且坏球较轻。
        第三次将9号放在左边,10号放在右边。
          1.如果右重则9号是坏球且比标准球轻;
          2.如果平衡则11号是坏球且比标准球轻;
          3.如果左重则10号是坏球且比标准球轻。
  3.如果左重则坏球在1-8号。
    第二次将2-4号拿掉,将6-8号从右边移到左边,把9-11号放
    在右边。就是说,把1,6,7,8放在左边,5,9,10,11放在右边。
      1.如果右重则坏球在拿到左边的6-8号,且比标准球轻。
        第三次将6号放在左边,7号放在右边。
          1.如果右重则6号是坏球且比标准球轻;
          2.如果平衡则8号是坏球且比标准球轻;
          3.如果左重则7号是坏球且比标准球轻。
      2.如果平衡则坏球在被拿掉的2-4号,且比标准球重。
        第三次将2号放在左边,3号放在右边。
          1.如果右重则3号是坏球且比标准球重;
          2.如果平衡则4号是坏球且比标准球重;
          3.如果左重则2号是坏球且比标准球重。
      3.如果左重则坏球在没有被触动的1,5号。如果是1号,
       则它比标准球重;如果是5号,则它比标准球轻。
        第三次将1号放在左边,2号放在右边。
          1.这次不可能右重。
          2.如果平衡则5号是坏球且比标准球轻;
          3.如果左重则1号是坏球且比标准球重;

四、核心代码

 1 def find(balls):
 2     #1.2.3.4球和5.6.7.8球进行称重比较
 3     result = weight(balls[:4], balls[4: 8])
 4     if result==RIGHT:
 5         result=weight([balls[0],balls[5],balls[6],balls[7]],[balls[4],balls[8],balls[9],balls[10]])
 6         if result==RIGHT:
 7             result=weight(balls[0],balls[1])
 8             if result==RIGHT:
 9                 return 0,'第1号球重'
10             elif result==EQUAL:
11                 return 4,'第5号球轻'
12         elif result==EQUAL:
13             result=weight(balls[1],balls[2])
14             if result==RIGHT:
15                 return 1,'第2号球重'
16             elif result==EQUAL:
17                 return 3,'第4号球重'
18             elif result==LEFT:
19                 return 2,'第3号球重'
20         elif result==LEFT:
21             result=weight(balls[5],balls[6])
22             if result==RIGHT:
23                 return 6,'第7号球轻'
24             elif result==EQUAL:
25                 return 7,'第8号球轻'
26             elif result==LEFT:
27                 return 5,'第6号球轻'            
28     elif result==EQUAL:
29         result = weight(balls[:3], balls[8: 11])
30         if result==RIGHT:
31             result=weight(balls[8],balls[9])
32             if result==RIGHT:
33                 return 9,'第10号球重'
34             elif result==EQUAL:
35                 return 10,'第11号球重'
36             elif result==LEFT:
37                 return 8,'第9号球轻'
38         elif result==EQUAL:
39             result=weight(balls[0],balls[11])
40             if result==RIGHT:
41                 return 11,'第12号球轻'
42             elif result==LEFT:
43                 return 11,'第12号球重'
44         elif result==LEFT:
45             result=weight(balls[8],balls[9])
46             if result==RIGHT:
47                 return 8,'第9号球重'              
48             elif result==EQUAL:
49                 return 10,'第11号球重'
50             elif result==LEFT:
51                 return 9,'第10号球重'
52     elif result==LEFT:      
53         result = weight([balls[0], balls[5], balls[6], balls[7]], [balls[4], balls[8], balls[9], balls[10]])
54         if result==RIGHT:
55             result=weight(balls[5],balls[6])
56             if result==RIGHT:
57                 return 5,'第6号球重'              
58             elif result==EQUAL:
59                 return 7,'第8号球重'
60             elif result==LEFT:
61                 return 6,'第7号球重'
62         elif result==EQUAL:           
63             result=weight(balls[1],balls[2])
64             if result==RIGHT:
65                 return 2,'第3号球轻'
66             elif result==EQUAL:
67                 return 3,'第4号球轻'
68             elif result==LEFT:
69                 return 1,'第2号球轻'
70         elif result==LEFT:
71             result=weight(balls[0],balls[1])
72             if result==EQUAL:
73                 return 4,'第5号球重'
74             elif result==LEFT:
75                 return 0,'第1号球轻'

五、总结

思考:12个小球需要称三次找出坏球,那若有更多的小球的小球需要称多少次才能找出坏球呢?

 

posted on 2020-02-21 13:41  老猫巴扎黑  阅读(2874)  评论(1编辑  收藏  举报