给定矩形内的最小数量瓦片

时间:2011-04-03 03:56:36

标签: algorithm tiles minimum

我一直在练习一些编程比赛问题(为了即将到来的比赛的乐趣和练习),我坚持这个问题:http://dwite.ca/questions/power_tiles.html

我不确定我应该从哪里开始= /。 我该如何解决这个问题?

感谢您的帮助

5 个答案:

答案 0 :(得分:2)

这是一个专门讨论这个话题的主题 - 在那里你可以看到其他的益智游戏者在想:http://compsci.ca/v3/viewtopic.php?t=26423

答案 1 :(得分:1)

看起来像我的动态编程问题

  • F(w,h)是用 h 矩形平铺 w 的最小平方数。
  • 找到F的递归公式:

    • 如果w = 0或h = 0则F(w,h)= 0
    • 否则,F(w,h)=

      For each allowable size a=i^2 <= min(w,h), try to place the a by a square (A)
       in the top left corner.
      One of the following possibilities will describe the
       optimal solution:
       +---+--+    +---+--+
       | A | C|    | A |  |
       +---+--+    +---+  |
       |  B   |    |B  |C |
       +------+    +---+--+
       So, choose the best of
         (1 + F(h-a, w) + F(h-a, w-a)) or
         (1 + F(h-a, a) + F(w-a, h))
      

在餐巾纸上进行大O分析,这似乎是O(side^2 * sqrt(side)) - ish算法。如果这太多了,你可以:

  • 尝试在问题中利用对称性(例如F(w,h)= F(h,w))
  • 再次检查分析以确定它太慢并且您需要另一种算法(也许您不需要计算所有(w,h)对?)
  • 找到问题的一些属性,允许更简单,不那么激进的策略。 (例如,尽可能选择最大的方块是一个简单的贪婪策略......但它在所有情况下都有效吗?)

答案 2 :(得分:1)

我会通过递归接近它。

编写一个接收两个整数值作为输入的函数。一个值是长度,另一个值是宽度。你可以适应的最大广场将基于最短的一面。其尺寸计算如下:

2^RoundDown(Log(ShortSide,Base:2))

这将为您提供第一个正方形并将矩形划分为3个或1个其他矩形,如果它是正方形且边长为2 ^ n,则为零。

通过简单的减法很容易得到剩余矩形的尺寸。计算尺寸后,再次为每个具有尺寸的新矩形调用该函数(在其自身内)。

当双方计算的差值为零时,该函数应该终止,即它是2 ^ n边长的正方形。

有点像这样:

Global int Counter
DivideRectangle(int Width, int Length)
    int BigSquare = 2^RoundDown(Log(Width,Base:2))
    if NOT(Width - BigSqaure = 0 AND Height- BigSqaure = 0)
        DivideRectangle(width - BigSquare, Height - BigSquare)
        DivideRectangle(width - BigSquare, BigSquare)
        DivideRectangle(BigSquare, Height - BigSquare)

    Counter += 1

这是关于它的正义;在整个操作之后返回的计数器是填充矩形的squres数。显然代码存在缺陷,需要改进,但它只是应该发生的概述。

希望这有帮助

答案 3 :(得分:0)

'1,2,4,8等'什么记得你?

看看图中,你会选择填充的顺序(大小的sterm)是什么?

答案 4 :(得分:0)

我首先要手工找出答案,说出半打左右......然后模拟你如何在一个程序中解决问题...然后在你有一个工作“蛮力”的答案后试着解决问题更优雅。

我会尝试先放入尽可能多的bigest尺寸的瓷砖,然后用适合的下一个bigest尺寸填充你可以的地方来解决这个问题。然后变小......直到填满。

您可以使用数组或数组来空间跟踪填充的空间...但我怀疑通过一些简单的计算可​​以更容易地实现这一点...比如获取尺寸并采用两者中的较小者并利用log base 2或类似的东西...

我确信有一个很好的整齐的递归解决方案..基于两个的权力..然后你可以解开这个非递归的解决方案......