在2D阵列/矩阵中找到由1组成的正方形

时间:2013-12-12 21:40:32

标签: c arrays

感谢您的帮助。对此,我真的非常感激。我一直在寻找SO的解决方案,但没有什么是我需要的。我在C中需要它。

我的任务是在数组中找到1的“最大正方形”。该数组仅包含0和1,并且看起来像这样:

4 4
0 1 1 1
0 1 0 1
0 1 1 1
1 0 1 0

输出应打印“左上角”1的[row][col]和“右下角”的[row][col],因此,对于我的示例,[0][1]和{{1 }}

我正在使用[2][3]函数获取getcolor()点的价值。

另外,我有这些功能可以获得最长的水平和垂直线。由于某种原因,它们仅适用于具有相同列数和行数的数组。例如,当我使用包含4列和5行的数组时,它无法正常工作。你能帮我吗?

[row][col]

2 个答案:

答案 0 :(得分:4)

如果你想要获得最大的方形,这与最长的水平和垂直线有关,因为它们可以分开并且没有与它们相关的方形。

在尝试解决复杂问题时,请勿尝试立即解决所有问题。

我们首先要做的是,数组的每个点都与一个正方形(每个点的最大点)相关联。所以我们必须找到那个方块:我们取一个数组的点,然后我们逐步通过连续的水平和垂直线。对于每个步骤,我们检查是否得到一个正方形并重复该过程,直到我们得到与该单个点相关联的最大正方形。

每当我们得到与一个点相关联的最大平方时,我们检查它是否大于与之前一点相关的最后一个最大平方。

连接这些部件后,我们得到了最终的程序。

程序中使用的变量的说明: enter image description here

链接到该计划http://pastebin.com/Yw05Gbtg或在此处查看:

修改

#include <stdio.h>

main()
{
    int lines=4, cols=4;
    int arr[4][4] = {
        {0,1,1,1,},
        {0,1,0,1,},
        {0,1,1,1,},
        {1,0,1,0,}
        };
    int x_start, y_start, x_end, y_end, d_max=0;
    int i, j, k, l;
    int col_start, line_start, col_end, line_end, checker;

    for (y_start=0; y_start<lines; y_start++){
        for (x_start=0; x_start<cols; x_start++){
            x_end = x_start;
            y_end = y_start;
            for (i=x_start, j=y_start; i<cols && j<lines; i++, j++){ // moving horizontally and vertically
                if (!arr[y_start][i] || !arr[j][x_start]){ // checking if the horizontal or vertical lines are not continuous
                    break;
                }
                else {
                    checker = 1;
                    for (k=x_start, l=y_start; k<i+1 && l<j+1; k++, l++){ // check if square
                        if (!arr[j][k] || !arr[l][i]){
                            checker = 0;
                            break;
                        }
                    }
                    if (checker){ // if square then
                        x_end = i;
                        y_end = j;
                    }
                }
            }
            if ((x_end-x_start)>d_max){
                col_start = x_start;
                line_start = y_start;
                col_end = x_end;
                line_end = y_end;
                d_max = col_end-col_start;
            }
        }
    }

    printf("The largest square is:\n[%d][%d] x [%d][%d]\n", line_start, col_start, line_end, col_end);

    // this is only to check if the program is working properly
    for (y_start=line_start; y_start<line_end+1; y_start++){
        printf("\n  ");
        for (x_start=col_start; x_start<col_end+1; x_start++){
                printf("%d ", arr[y_start][x_start]);
        }
    }
    printf("\n");
}

答案 1 :(得分:0)

代码中某处的行和列之间存在混淆。要找到它,请将变量ijk重命名为更有意义的内容,例如rowcol_startcol_end

至于查找最大平方,您可能需要使用prefix sums