【问题标题】:Change matrix columns and get the number of lines of a sub-matrix with all elements equals更改矩阵列并获取所有元素等于的子矩阵的行数
【发布时间】:2015-11-12 08:25:57
【问题描述】:

我有一个矩阵。它只能包含 0 和 1。示例:

1 0 1 0 1

1 0 1 0 1

1 1 1 1 1

0 0 0 0 1

1 1 1 1 1

0 0 0 1 0

0 1 0 0 0

我需要显示所有元素 = 0 的子矩阵(m 行和 m 列 - m x m)的最大行数。程序可以更改矩阵列的顺序。

我是 C 初学者,不知道如何开始。

【问题讨论】:

  • 到目前为止你有什么尝试?对于 > 1k 的人来说,这看起来像是你第一次来这里......
  • 正如我所说,我是一个初学者。我尝试了一些东西,但没有结果。我尝试的所有方法都不起作用。我试图确定每行上为 0 的元素数量,并为每个尝试检查下一行的同一位置是否有元素为零,但这不起作用,因为我需要验证对的列如果是 0,我不知道该怎么做。
  • 至少,提供一些代码并展示你的工作。例如,您如何存储矩阵?
  • of a sub-matrix (m lines and m columns - m x m) 表示行列子矩阵相等?也就是说一个n * m(n != m)的子矩阵是无效的?

标签: c arrays matrix


【解决方案1】:

你提到的问题可以称为最大方块问题

您可以通过解决方案找到与此相关的几个主题:

Dynamic programming - Largest square block

Find largest rectangle containing only zeros in an N×N binary matrix

Maximize the rectangular area under Histogram

Finding maximum size sub-matrix of all 1's in a matrix having 1's and 0's

这是我为此完成的一个 C 函数,数组 grid 是扁平的,如您所见,我使用 counter 数组:

typedef struct s_max
{
    t_uint16 val_max_;
    t_uint16 idx_max_;
} t_max;

t_max largest_square_block(t_uint8 *grid, const t_uint16 h, const t_uint16 w)
{
    t_uint16 up, upleft, left;
    t_uint16 val_max = 0;
    t_uint16 idx_max = 0;

    t_uint16 *counter = (t_uint16 *) malloc(w * h * sizeof(t_uint16));
    counter[0] = grid[0];

    for (t_uint i = 1; i < w * h; i ++)
    {   
        up = upleft = left = 0;
        if (grid[i] != YOURMAGICNUMBER)
        {
            if (i >= w)
                up = counter[i - w];
            if (i % w > 0)
            {
                left = counter[i - 1];
                if (i >= w)
                    upleft = counter[i - 1 - w];
            }
            counter[i] = 1 + min3_uint16(up, upleft, left);
            if (counter[i] > val_max)
            {
                val_max = counter[i];
                idx_max = i;
            }

        }
    }

    free(counter);

    t_max data_max;
    data_max.val_max_ = val_max;
    data_max.idx_max_ = idx_max;

    return data_max;
}

【讨论】:

    猜你喜欢
    • 2021-01-24
    • 1970-01-01
    • 2012-11-22
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    相关资源
    最近更新 更多