zoukankan      html  css  js  c++  java
  • 小球称重问题~通过三次称重找出十二个小球质量不一样的小球,并判断小球轻重

    小球称重问题

    一、问题描述

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

    二、问题分析

    将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个小球需要称三次找出坏球,那若有更多的小球的小球需要称多少次才能找出坏球呢?

  • 相关阅读:
    java里的分支语句--程序运行流程的分类(顺序结构,分支结构,循环结构)
    Java里的构造函数(构造方法)
    Java里this的作用和用法
    JAVA中的重载和重写
    从键盘接收字符类型的数据并实现剪刀石头布的规则
    使用Notepad++编码编译时报错(已解决?)
    云就是网络,云计算呢
    使用JavaMail创建邮件和发送邮件
    mysql锁机制
    java中几种常用的设计模式
  • 原文地址:https://www.cnblogs.com/cyt99/p/12341087.html
Copyright © 2011-2022 走看看