楼层所需的最小瓷砖数

时间:2017-01-11 21:34:33

标签: python

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

  • 基本的数学和逻辑运算符(+ .-,*,/,//,%,**,<。< =,>,> =,==,!=和,或者,不是)
  • Math模块中可用的任何函数和常量 min,max,abs,
  • len(字符串长度)
  • int,str,float conversion functions

我不是在寻找更多答案,而是如何解决问题。

该问题要求确定所有具有覆盖矩形房间地板所需的相同方向的相同瓷砖的最小数量。来自超过楼面面积的瓷砖的任何多余部分都将被丢弃而不能丢弃 重复使用。编写一个名为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

提前致谢!

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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。