【问题标题】:Min number of tiles required for a floor地板所需的最小瓷砖数量
【发布时间】:2017-01-11 21:34:32
【问题描述】:

我开始学习如何在 python 中编程,我遇到了这个问题,我只能使用这些函数:

  • 基本的数学和逻辑运算符(+.-、*、/、//、%、**、<.>、>=、==、!=、and、or、not)
  • 数学模块中可用的任何函数和常量 最小值、最大值、绝对值、
  • 类型
  • len(字符串长度)
  • int、str、float 转换函数
  • 圆形

我不是在寻找答案,而是在寻找解决问题的方法。

该问题要求确定覆盖矩形房间地板所需的所有具有相同方向的相同瓷砖的最小数量。任何超出地板面积的瓷砖都将被丢弃,并且不能 重复使用。编写一个名为 min_tiles 的 Python 函数,它消耗 4 个正整数 room_width、room_length、tile_width、tile_length,并生成 完全覆盖房间地板所需的最少瓷砖数量。

这里有一些例子:

min_tiles(4,4,2,2) => 4

如果瓷砖是矩形的,它们只能朝向一个方向,不能 两个都。因此,如果地板是 3 x 4,而瓷砖是 1 x 3,那么在一个方向上需要 6 个瓷砖来覆盖地板(丢弃多余的碎片),但在另一个方向上只需要 4 个瓷砖来覆盖地上。在这种情况下,您应该生成最小值,即 4。因此 min_tiles(3,4,1,3) => 4

提前致谢!

【问题讨论】:

    标签: python


    【解决方案1】:

    您可以使用动态编程解决方案来解决此问题,但如果您是一般编程新手,这将很困难。您可以假设首先放置一个与地板一角对齐的瓷砖(有两个可能的方向),一旦放置了这个瓷砖,它就会产生两个较小矩形的子问题。

    您还知道,您可以使用带有l x w 的一个图块生成n(l) x m(w)n(w) x m(l) 矩形。我认为完全符合边界的最大(按面积)矩形将始终是解决方案的一部分。也许试着看看你是否能证明总是如此?

    【讨论】:

    • ...我没有足够的声誉来评论其他答案。 @Miloslav 您的代码在min_tiles(2, 4, 1, 3) 上失败。 @Joran 你的回答不考虑丢弃多余的。
    • 我不确定我是否可以使用动态编程,我们唯一可以使用的是问题中列出的函数。是的,我想我明白你在第二段中试图解释的内容,我会试试的。
    • 我不确定什么是允许的。动态编程意味着您存储一些类似数组的值结构,但您没有使用基本算术和 min/max 之外的任何数学函数。
    【解决方案2】:
    def min_tiles_horizontal(room_width,room_length,tile_width,tile_length):
      return math.ceil(room_width / float(tile_width)) * math.ceil(room_length / float(tile_length))
    
    def min_tiles(room_width,room_length,tile_width,tile_length):
      return min(
          min_tiles_horizontal(room_width,room_length,tile_width,tile_length),        
          min_tiles_horizontal(room_width,room_length,tile_length,tile_width))
    

    min_tiles_horizontal 仅在瓦片为水平方向时计算所需瓦片的数量。在min_tiles 中,我们调用min_tiles_horizontal 两次——一次用于获取水平平铺的数字,一次用于获取垂直平铺的数字(我们通过切换tile_lengthtile_width 作为参数来获得)——然后我们返回这两个数字中的最小值。

    float 用于进行浮点除法,例如对于 3 / float(2),我们将得到 1.5(不使用 float,我们将进行整数除法,得到 1)。然后使用math.ceil 将数字四舍五入到最接近的更大数字,例如math.ceil(2.1) 会给我们 3,因为当你需要 2.1 瓦片时,你必须使用 3。

    【讨论】:

    • 我想知道你能不能解释一下这个思考过程?我不确定你为什么使用 float 和 math.ceil?我猜这是答案的一部分,我必须为垂直编写一个类似的函数?
    • 我不知道每个 python 版本是否不同,但我有 3 个,当我不使用浮点数时,我仍然得到一个浮点数,所以 3/2 仍然会给我 1.5 所以我想这部分代码是不必要的。
    • 是的,在 Python3 3/2 == 1.5 中,在 Python 2.7 3/2 == 1 中。所以你可以省略 float 函数,但如果你把它留在里面,它在两个版本中都可以工作.
    猜你喜欢
    • 2012-09-19
    • 1970-01-01
    • 2013-01-26
    • 1970-01-01
    • 2011-07-28
    • 2019-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多