我一直在练习一些编程比赛问题(为了即将到来的比赛的乐趣和练习),我坚持这个问题:http://dwite.ca/questions/power_tiles.html
我不确定我应该从哪里开始= /。 我该如何解决这个问题?
感谢您的帮助
答案 0 :(得分:2)
这是一个专门讨论这个话题的主题 - 在那里你可以看到其他的益智游戏者在想:http://compsci.ca/v3/viewtopic.php?t=26423
答案 1 :(得分:1)
看起来像我的动态编程问题
找到F的递归公式:
否则,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算法。如果这太多了,你可以:
答案 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或类似的东西...
我确信有一个很好的整齐的递归解决方案..基于两个的权力..然后你可以解开这个非递归的解决方案......