感谢您的帮助。对此,我真的非常感激。我一直在寻找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]
答案 0 :(得分:4)
如果你想要获得最大的方形,这与最长的水平和垂直线有关,因为它们可以分开并且没有与它们相关的方形。
在尝试解决复杂问题时,请勿尝试立即解决所有问题。
我们首先要做的是,数组的每个点都与一个正方形(每个点的最大点)相关联。所以我们必须找到那个方块:我们取一个数组的点,然后我们逐步通过连续的水平和垂直线。对于每个步骤,我们检查是否得到一个正方形并重复该过程,直到我们得到与该单个点相关联的最大正方形。
每当我们得到与一个点相关联的最大平方时,我们检查它是否大于与之前一点相关的最后一个最大平方。
连接这些部件后,我们得到了最终的程序。
程序中使用的变量的说明:
链接到该计划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)
代码中某处的行和列之间存在混淆。要找到它,请将变量i
,j
和k
重命名为更有意义的内容,例如row
,col_start
和col_end
。
至于查找最大平方,您可能需要使用prefix sums。