覆盖大小为n×m的矩形网格所需的最小平方数

时间:2017-02-13 17:50:04

标签: algorithm recursion geometry computational-geometry

问题陈述是找到覆盖大小为n乘m的矩形网格所需的最小平方数,其边强度为2

我写了以下代码:

ll solve(ll n,ll m)
{
    if(n==0||m==0)
        return 0;
    else if(n%2==0&&m%2==0)
        return solve(n/2,m/2); 
    else if(n%2==0&&m%2==1)
        return (solve(n/ 2,m/ 2));
    else if(n%2==1&&m%2==0)
        return (solve(n/ 2,m/ 2)); 
    else
        return (n+m-1+solve(n/2,m/2)); 
}

建议我,因为它给出了错误的答案。

1 个答案:

答案 0 :(得分:0)

W.l.o.g。我们说n> = m并选择m为2 ^ x的形式。 (如果m是任意的< = n,它也只意味着我们将相同的方法应用于第二个矩形,其大小为m-2 ^ x,其中x = int_floor(ld(m)),ld是log当然是2的基数。)

以下代码段应计算所需的方格数。

countSquares(m,n,x) :
  if n == 0 : return 0
  if n == 1 : return m
  if n/2^x >= 1 : 
    return m/2^x + countSquares(m,n-2^x,x-1)
  else
    countSquares(m,n,x-1)

第3个if中的返回:m / 2 ^ x总是一个自然数,因为m的开头是2 ^ x,任何2 ^(x-(xi))都是自然数。

如果我们只对下限感兴趣。我假设选择一个大小为a次b的矩形,其中a:= 2 ^ x - 1,b:= 2 ^ y -1应该导致大约ld(a)乘以ld(b)的平方数。

将代码片段扩展为任意m似乎涉及第二次递归:

partitionAndCount(n,m) :
  if n < m : swap(n,m)

  var x = floor(ld(m))
  var mRes = m - 2^x

  if mRes == 0 : return countSquares(2^x,n,x-1)
  if mRes == 1 : n + return countSquares(2^x,n,x-1)
  return partitionAndCount(n,mRes) + countSquares(2^x,n,x-1)