二维数组、函数、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;
}
问题是编写一个函数,它接受一个二维数组、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;
}