二维数组、函数、C

2d arrays, functions, C

问题是编写一个函数,它接受一个二维数组、2 个表示数组中行数和列数的整数,并打印出一个表示数组中最大正方形的 2 X 2 数组。最大正方形是指数组中其元素之和最大的正方形。

给定数组:1 2 3 4

5 6 7 8

9 10 11 12

输出应该是:

7 8

11 12

虽然我们从未了解 subarray/matrixes 和 class 中的 kadane 算法,但我整天都在线,我只是希望这有点接近解决方案? (*我的教授只对功能感兴趣,我们甚至不应该提交完整的程序)它是昨天到期的,但我很迷茫,如果可以的话请帮忙并提前致谢!

/*Void f(x) that opens file to take in given array*/
void largestSqaure(int array[ROW][COLUMN])
{  

     FILE*ifp= fopen("largestSquare.txt", "r");
     FILE*ofp= fopen("output.txt", "w");
     for(R0W= 0; ROW < SIZE; ROW++)
              fscanf(ifp, "%d", &array[ROW]);

    /*Declaring variables*/
    int maxSum = INT_MIN, finalLeft, finalRight, finalTop, finalBottom;
    int left, right, i;
    int temp[ROW], sum, start, finish;

    /* Adding left and right columns & intiializing size in loop*/
    for (left = 0; left < COLUMN; ++left)
    {
        memset(temp, 0, sizeof(temp));

        for (right = left; right < COLUMN; ++right)
        {
            /* Calucalting sums for in between*/
            for (i = 0; i < ROW; ++i)
                temp[i] += array[i][right];

            /* Finding the max subarray using kadane*/
            sum = kadane(temp, &start, &finish, ROW);

            if (sum > maxSum)
            {
                maxSum = sum;
                finalLeft = left;
                finalRight = right;
                finalTop = start;
                finalBottom = finish;
            }
        }
    }

    /* Printing the 2 X 2 array that had max sum*/
    printf("%d, %d\n", finalTop, finalLeft);
    printf("d, %d\n", finalBottom, finalRight);

 system("pause");

}

听起来你想要做的是在 nxm 矩阵中找到 2x2 网格,这样你的网格就是矩阵中最大的 2x2 子网格。

因此,一种简单的方法是遍历 nxm 矩阵,检查所有 2x2 网格,并将最大网格存储在 2x2 答案数组中。

当n < 2 或m < 2 时,结果未定义。当n=m=2时,只有一个2x2维的子网格,所以你找到了。当 n > 2 或 m > 2 时,您的 nxm 矩阵中将有一些 x 个 2x2 数组。

for(i=0; i<n-1; i++){
    for(j=0;j<m-1;j++){
        //is matrix m[i][j] ... m[i+1][j+1] greater
        //than my previous maximal 2x2
        //sub grid? If so update.
    }
}

想法是检查 nxm 矩阵中的所有 2x2 子网格,如果发现更大的网格,则更新当前最大 2x2 网格。

#include <stdio.h>
#include <limits.h>

#define ROW    3
#define COLUMN 4

int main(void){
    int a[ROW][COLUMN] = {
        {1,2,3,4},
        {5,6,7,8},
        {9,10,11,12}
    };
    int max = INT_MIN;
    int max_r, max_c;
    int r, c;
    for(r=0; r < ROW-1; ++r){
        for(c=0; c < COLUMN-1; ++c){
            int sum = a[r][c] + a[r][c+1] + a[r+1][c] + a[r+1][c+1];
            if(sum > max){
                max = sum;
                max_r = r;
                max_c = c;
            }
        }
    }
    printf("%d %d\n", a[max_r][max_c], a[max_r][max_c+1]);
    printf("%d %d\n", a[max_r+1][max_c], a[max_r+1][max_c+1]);
    return 0;
}