小球稱重問題
一、問題描述
十二個小球進行稱重,只能稱三次,找出不一樣的小球,並判斷異球的輕重。
二、問題分析
將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個小球需要稱三次找出壞球,那若有更多的小球的小球需要稱多少次才能找出壞球呢?