Algorithm 给定矩形内的最小分幅数
我一直在练习一些编程竞赛问题(为了好玩和为即将到来的竞赛做练习),我一直在练习这个问题: 我真的不确定从哪里开始。 我应该如何解决这个问题Algorithm 给定矩形内的最小分幅数,algorithm,tiles,minimum,Algorithm,Tiles,Minimum,我一直在练习一些编程竞赛问题(为了好玩和为即将到来的竞赛做练习),我一直在练习这个问题: 我真的不确定从哪里开始。 我应该如何解决这个问题 谢谢你的帮助你还记得什么“1、2、4、8等” 请看这张图,您选择的填充顺序(以立方米为单位)是什么?您记得“1、2、4、8等”是什么 看看这个数字,你会选择什么样的填充顺序(以立方米为单位)?我会先用手算出答案,比如说半打左右。。。然后在程序中模拟你是如何解决这个问题的。。。然后,在你有了一个有效的“蛮力”答案后,试着更优雅地解决问题 我会首先尝试将尽可能多
谢谢你的帮助你还记得什么“1、2、4、8等”
请看这张图,您选择的填充顺序(以立方米为单位)是什么?您记得“1、2、4、8等”是什么
看看这个数字,你会选择什么样的填充顺序(以立方米为单位)?我会先用手算出答案,比如说半打左右。。。然后在程序中模拟你是如何解决这个问题的。。。然后,在你有了一个有效的“蛮力”答案后,试着更优雅地解决问题 我会首先尝试将尽可能多的最大尺寸的瓷砖放进去,然后用下一个最大尺寸的瓷砖填充。然后再小一点。。。直到填满为止 您可以使用数组或数组专门跟踪填充的空间。。。然而,我怀疑有一个更简单的方法通过一些简单的计算来做到这一点。。。比如取尺寸,取两者中较小的一个,利用对数基数2或类似的东西
我相信有一个很好的简洁的递归解决方案。。以二的幂为基础。。然后你可以把它分解成一个非递归的解决方案 我会先用手算出答案,比如说半打左右。。。然后在程序中模拟你是如何解决这个问题的。。。然后,在你有了一个有效的“蛮力”答案后,试着更优雅地解决问题 我会首先尝试将尽可能多的最大尺寸的瓷砖放进去,然后用下一个最大尺寸的瓷砖填充。然后再小一点。。。直到填满为止 您可以使用数组或数组专门跟踪填充的空间。。。然而,我怀疑有一个更简单的方法通过一些简单的计算来做到这一点。。。比如取尺寸,取两者中较小的一个,利用对数基数2或类似的东西
我相信有一个很好的简洁的递归解决方案。。以二的幂为基础。。然后你可以把它分解成一个非递归的解决方案 这里有一个专门讨论这个主题的线程-你可以看到其他拼图者在想什么:这里有一个专门讨论这个主题的线程-你可以看到其他拼图者在想什么:在我看来像是一个动态编程问题
- 设F(w,h)为平铺w×h矩形的最小正方形数
- 找到F的递归公式:
- 如果w=0或h=0,则F(w,h)=0
- 否则,F(w,h)=
对于每个允许的大小,a=i^2在我看来就像一个动态规划问题
- 设F(w,h)为平铺w×h矩形的最小正方形数
- 找到F的递归公式:
- 如果w=0或h=0,则F(w,h)=0
- 否则,F(w,h)=
对于每个允许的大小a=i^2我将通过递归来接近它 编写一个接收两个整数值作为输入的函数。一个值是长度,另一个值是宽度。你能容纳的最大正方形是以最短的边为基础的。其尺寸计算如下:
这将为您提供第一个正方形,并将矩形分成3个或1个其他矩形,如果它是边长为2^n的正方形,则什么也没有 通过简单的减法很容易得到剩余矩形的尺寸。计算尺寸后,为每个新矩形及其尺寸再次调用函数(在其内部) 当为两侧计算的差值为零时,即为2^n边长的平方时,应终止该函数 有点像这样:2^RoundDown(Log(ShortSide,Base:2))
这就是它的公正性;整个操作后返回的计数器是填充矩形的squre数。显然,代码有缺陷,需要改进,但它只是应该发生什么的概述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
希望这对我有所帮助,我将通过递归来实现它 编写一个接收两个整数值作为输入的函数。一个值是长度,另一个值是宽度。你能容纳的最大正方形是以最短的边为基础的。其尺寸计算如下:
这将为您提供第一个正方形,并将矩形分成3个或1个其他矩形,如果它是边长为2^n的正方形,则什么也没有 通过简单的减法很容易得到剩余矩形的尺寸。计算尺寸后,为每个新矩形及其尺寸再次调用函数(在其内部) 当为两侧计算的差值为零时,即为2^n边长的平方时,应终止该函数 有点像这样:2^RoundDown(Log(ShortSide,Base:2))
这就是它的公正性;整个操作后返回的计数器是填充矩形的squre数。显然,代码有缺陷,需要改进,但它只是应该发生什么的概述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
希望这有帮助链接已断开。存档页面:链接已失效。归档页面:请注意,相同的公式不适用于分幅不是二的幂的情况。请参阅反例。请注意,相同的公式不适用于瓷砖不是二的幂的情况。有关反例,请参见。