【问题标题】:Minimum number of squares to tile the rectanlge in C在C中平铺矩形的最小正方形数
【发布时间】:2021-05-31 11:11:01
【问题描述】:

任务:

假设一个大小为 n × m 的矩形。确定最小平方数 需要平铺矩形。

我尝试了以下方法:

#include <stdlib.h>
#include <math.h>
#define MIN(a,b) (((a)<(b))?(a):(b))
#define MAX(a,b) (((a)>(b))?(a):(b))

int matrix(int n, int m)
{
    int dp[n+1][m+1];

    for(int i=0;i<=n;i++)
    {
        for(int j=0;j<=m;j++)
        {
            dp[i][j] = INFINITY;
        }
    }

    return MinSquare(n, m, dp);
}

int MinSquare(int n, int m, int dp[n][m])
{
    int horizontalMin = INFINITY;
    int verticalMin = INFINITY;

    if(n==m)
    {
        dp[m][n] = 1;
        return 1;
    }
    if(dp[n][m] != INFINITY)
    {
        return dp[n][m];
    }
    for(int i=1;i<=n;i++)
    {
        verticalMin = MIN(MinSquare(i,m,dp)+ MinSquare(n-i,m,dp), horizontalMin);
    }
    for(int i=1;i<=m;i++)
    {
        horizontalMin = MIN(MinSquare(n,i,dp)+MinSquare(n,m-i,dp), horizontalMin);
    }
    dp[n][m] = MIN(verticalMin, horizontalMin);

    return dp[n][m];
}

int main()
{
    printf("%d", matrix(3,4));
    return 0;
}

这导致 2147483647,我不明白为什么我的代码不能正确运行。

有什么提示吗?

【问题讨论】:

  • 另一个问题是你递归调用MinSquare,改变了mn的值。这不起作用,因为第三个参数取决于m。我很惊讶编译器没有发出警告!\
  • 算法看起来太简单了。在there 网站上,他们提出了同样的问题,但也给出了一些例子。这里的算法不会解决那里最复杂的例子。
  • @anatolyg 你说得对——如果实施得当,如果你要求每个剪辑都一直穿过一块,这个算法将解决问题。
  • 我不明白为什么正方形可以比矩形大。因为在一次迭代中 m 是固定的,而另一个是可变的,而在第二次迭代中则相反。
  • 请不要以使现有答案无效的方式编辑问题。 Stack Overflow 不是个人调试服务。它旨在成为一个持久的问题和答案存储库,为将来的其他读者提供服务。他们应该找到一个明确提出的问题和答案。

标签: c dynamic-programming


【解决方案1】:

这里有两个严重的问题。可能不止这些,但这些可以为您提供一个良好的开端。

问题 1

INFINITYfloat 的特殊值。 C 标准没有定义分配int anyIntVar = INFINITY 的行为,不应该使用它。

一种可能的解决方法是使用INT_MAX(在&lt;limits.h&gt; 中定义)而不是INFINITY

问题 2

verticalMin = MIN(MinSquare(i,m,dp)+ MinSquare(n-i,m,dp), horizontalMin);

应该是

verticalMin = MIN(MinSquare(i,m,dp)+ MinSquare(n-i,m,dp), verticallMin);

【讨论】:

  • 根据 C 2018 6.3.1.4 1,浮点无穷大到整数类型的转换具有未定义的行为;不需要产生INT_MAX
  • 行为未定义的事实并不意味着转换产生的结果值未指定。这意味着程序的整个行为不是由 C 标准定义的。它不仅不一定会产生特定的结果,而且程序可能会中止,或者它可能会在其他操作中以错误的结果继续执行,或者它可能会执行完全不同的代码。在存在未定义行为的执行路径上,C 标准对程序的行为没有要求,根本没有。
  • @EricPostpischil 谢谢,我改写了。
  • 句子“因此,以下检查总是正确的。”是不正确的。因为程序的行为在将INFINITY 转换为整数类型后不再定义,C 标准将允许以下检查评估为真。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-16
相关资源
最近更新 更多