首页 > 编程语言 >小球天平称重问题(python求解版本)

小球天平称重问题(python求解版本)

时间:2024-12-20 23:03:31浏览次数:10  
标签:different 12 python 小球 ball 个球 heavier 称重

Problem: 这是一个经典的称重问题:有 12 个球,其中 11 个重量相同,1 个球重量不同(可能更重或更轻),要求设计一种策略,用尽可能少的天平称重次数找出这个不同的球,并判断它是更重还是更轻。

Solution Step: 可以通过分治法来解决这个问题。每次将球分成多个组,通过比较各个组的重量来确定异常小球所在位置,最终确定几号球是异常小球。

第一次比较:(1,2,3,4) vs (5,6,7,8);

第二次比较:(9,10,11,12) vs (5,6,7,8)

第三次比较:(1,2,9,10) vs (3,4,11,12)

这样的比较安排确保:所有12个球都至少参与了一次比较;即使组合之间有重叠,可以通过结果推断出异常球;每次比较都是4个球对4个球,保持平衡。

现在无论异常球是1-12中的哪一个,都能通过这三次比较的结果来验证。

Python代码实现:

import numpy as np
import random


def get_weight(balls, different_ball, is_heavier):
    """模拟称重过程

    Args:
        balls: 待称重的球序号列表
        different_ball: 不同重量的球的序号(1-12)
        is_heavier: True表示更重,False表示更轻
    """
    left_total = sum(1 for b in balls[0] if b == different_ball)
    right_total = sum(1 for b in balls[1] if b == different_ball)

    if left_total > right_total:
        return 1 if is_heavier else -1
    elif left_total < right_total:
        return -1 if is_heavier else 1
    else:
        return 0

def compare_weights(left, right, different_ball, is_heavier):
    """比较两组球的重量"""
    balls = [left, right]
    result = get_weight(balls, different_ball, is_heavier)
    return result  # 1表示左边重, -1表示右边重, 0表示相等

def verify_ball(different_ball: int, is_heavier: bool):
    """验证给定的不同球是否正确

    Args:
        different_ball: 用户声称的不同重量球的序号(1-12)
        is_heavier: 用户声称球是更重(True)还是更轻(False)
    """
    # 修改比较方案,确保12个球都参与比较
    comparison_1 = compare_weights([1, 2, 3, 4], [5, 6, 7, 8], different_ball, is_heavier)
    comparison_2 = compare_weights([9, 10, 11, 12], [5, 6, 7, 8], different_ball, is_heavier)
    comparison_3 = compare_weights([1, 2, 9, 10], [3, 4, 11, 12], different_ball, is_heavier)

    print(f"比较结果:")
    print(f"1,2,3,4 vs 5,6,7,8: {'左重' if comparison_1 > 0 else '右重' if comparison_1 < 0 else '相等'}")
    print(f"9,10,11,12 vs 5,6,7,8: {'左重' if comparison_2 > 0 else '右重' if comparison_2 < 0 else '相等'}")
    print(f"1,2,9,10 vs 3,4,11,12: {'左重' if comparison_3 > 0 else '右重' if comparison_3 < 0 else '相等'}")

    return True

def validate_input():
    while True:
        try:
            ball_num = int(input("请输入不同重量的球的序号(1-12): "))
            if 1 <= ball_num <= 12:
                break
            else:
                print("请输入1-12之间的数字")
        except ValueError:
            print("请输入有效的数字")
    
    while True:
        weight = input("这个球是重了还是轻了?(heavy/light): ").lower()
        if weight in ['heavy', 'light']:
            return ball_num, weight == 'heavy'
        print("请输入 heavy 或 light")

def main():
    ball_num, is_heavier = validate_input()
    result = verify_ball(ball_num, is_heavier)
    if result:
        print("你的答案与称重结果一致!")
    else:
        print("你的答案与称重结果不一致!")

if __name__ == "__main__":
    main()

代码功能介绍:

通过对12个小球进行多次称重,来找出与其他11个球重量不同的小球。

首先定义get_weight函数:

  • 接收两组球的序号和不同球的信息
  • 计算不同重量的球在左右两边的数量
  • 根据不同球是重还是轻返回称重结果

其次定义compare_weights函数:

  • 对两组球进行重量比较
  • 把两组球组装成天平左右两边的形式
  • 调用get_weight得到称重结果

然后是定义verify_ball 函数:

  • 进行三次不同组合的称重比较:
    • 第一次:前8个球分成两组比较
    • 第二次:后4个球和中间4个球比较
    • 第三次:交叉组合比较 这三次比较可以确定任意一个异常球的位置和重量状态

测试验证代码称重结果如下:

在代码中防止系统盲目进行计算输出不正确的小球,在这里增加了用户的交互,通过在开始指定重量异常小球,来进行称重验证。最终确定异常小球是我们输入的目标球序号。

标签:different,12,python,小球,ball,个球,heavier,称重
From: https://blog.csdn.net/weixin_44979308/article/details/144561462

相关文章

  • Python 高级特性:描述器(Descriptor)简介
    Python高级特性:描述器(Descriptor)简介原创 defr bebettercoder 2024年12月01日20:00 广东1.什么是描述器描述器(Descriptor)是Python中一个强大而优雅的特性,它允许我们自定义对象属性的访问方式。简单来说,描述器就是一个实现了描述器协议的类,这个协议包含 __get__......
  • 使用Python进行人脸识别
    引言:机器视觉在近些年来很热门,比如自动驾驶、人脸识别等领域都有很大的作用,所以也有很多人愿意去学习相关内容,本文将初步探索人脸识别领域中人脸识别的模块。正文:  如果真的要自己从底层开发识别人脸的程序,那么难度还是很大的。  其实还是站在巨人的肩膀上看世界,权当......
  • Build an Intrusion-Detection-System using Python
    BuildanIntrusion-Detection-SystemusingPythonhttps://medium.com/@nawailk/build-an-intrusion-detection-system-using-python-nawail-khan-8b9e09e6cf88IhavebuiltanIntrusionDetectionSystem,whichalsoworksreal-timetosecureanyspecifiedarea.Th......
  • python 绝对导入和相对导入
    参考:https://blog.csdn.net/huaanxiang/article/details/143687649绝对导入:标准库导入假设有a.py这么写:importos这个是从标准库导入。当前文件目录导入如果a.py的同级目录下有一个b.py,b.py中有classB,那么在a.py也可以导入:frombimportB这个是从当前文件......
  • Python中所有子图标签Legend显示详解
    在数据可视化中,图例(legend)是一个非常重要的元素,它能够帮助读者理解图表中不同元素的含义。特别是在使用Python进行可视化时,matplotlib库是一个非常强大的工具,能够轻松创建包含多个子图的图表,并在每个子图中显示图例。本文将详细介绍如何在Python的matplotlib库中为所有子图显示标......
  • Python中的数据序列(列表,元组,字典,集合)
    目录列表 语法特点 列表的操作方式查操作增操作改操作删操作元组语法运用场景元组的操作字典语法 字典的操作方式增操作删操作 改操作查操作字典的遍历操作集合语法集合的操作方式增操作删操作 查操作 数据序列之间的转换 列表 语法......
  • 使用Python实现两组数据纵向排序
    使用Python实现两组数据纵向排序 本文详细介绍了如何使用Python实现两组数据的纵向排序,包括开发思想、开发流程和代码示例。通过本文的学习,读者可以掌握如何使用Python的内置函数和第三方库进行排序操作,并能够处理各种边界情况。本文提供的代码示例具有实际应用价值,可以用于......
  • python毕设基于架构的信息发布系统管理和运维的实现ahh5z程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着信息技术的迅猛发展,信息传播已成为企业运营中不可或缺的一部分。无论是大型企业还是初创公司,都需要一个高效、稳定的信息发布系统来宣......
  • python毕设基于学生学情管理系统的设计与实现a5ezy程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着教育信息化的不断深入,学生学情管理成为高校教育管理工作中的重要一环。传统的学生学情管理方式往往依赖于纸质记录、人工统计,不仅效率......
  • Python 二分查找
    作者制作不易,关注、点赞、收藏一下吧!1.二分查找的概念和基本步骤二分查找是一种高效的搜索算法,适用于在一个有序数组中查找特定元素。其基本思想是每次将搜索范围缩小一半,从而快速定位目标元素。二分查找要求输入数组必须是有序的。时间复杂度为O(logn)。初始化:设定两......