Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 给定矩形内的最小分幅数_Algorithm_Tiles_Minimum - Fatal编程技术网

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我将通过递归来接近它

          编写一个接收两个整数值作为输入的函数。一个值是长度,另一个值是宽度。你能容纳的最大正方形是以最短的边为基础的。其尺寸计算如下:

          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
          
          这就是它的公正性;整个操作后返回的计数器是填充矩形的squre数。显然,代码有缺陷,需要改进,但它只是应该发生什么的概述


          希望这对我有所帮助,我将通过递归来实现它

          编写一个接收两个整数值作为输入的函数。一个值是长度,另一个值是宽度。你能容纳的最大正方形是以最短的边为基础的。其尺寸计算如下:

          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
          
          这就是它的公正性;整个操作后返回的计数器是填充矩形的squre数。显然,代码有缺陷,需要改进,但它只是应该发生什么的概述


          希望这有帮助

          链接已断开。存档页面:链接已失效。归档页面:请注意,相同的公式不适用于分幅不是二的幂的情况。请参阅反例。请注意,相同的公式不适用于瓷砖不是二的幂的情况。有关反例,请参见。