小球稱重問題~通過三次稱重找出十二個小球質量不一樣的小球,並判斷小球輕重


小球稱重問題

一、問題描述

十二個小球進行稱重,只能稱三次,找出不一樣的小球,並判斷異球的輕重。

二、問題分析

將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個小球需要稱三次找出壞球,那若有更多的小球的小球需要稱多少次才能找出壞球呢?

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM