В матрице найти подматрицу, у которой самая высокая сумма все чисел - C (СИ)
Формулировка задачи:
Доброго времени суток, тут такое вот дело, надо написать функция котороая ищет из квадратной матрицы(двойной массив) маленькую квадратную матрицу у которой саммая высокая сумма все чисел.функция выведит на экран данные начала под матрицы и ее сумму.
функция получает массив и его размер.
заранее спасибо)
Решение задачи: «В матрице найти подматрицу, у которой самая высокая сумма все чисел»
textual
Листинг программы
#include <stdio.h>
#include <malloc.h>
typedef struct {
int left, top, right, bottom;
} rect;
int** matrix_create(int n);
void matrix_free(int** mat, int n);
int** matrix_input(FILE* _in, int* n);
int matrix_subsum(int** mat, int n, rect* pr);
int main(void){
int i, j, sum, **mat, n;
rect rc;
/* ввод из файла
FILE* fp = fopen("file.txt", "rt");
mat = matrix_input(fp, &n);
fclose(fp);
*/
mat = matrix_input(stdin, &n);
if(mat == NULL)
return 1;
putchar('\n');
sum = matrix_subsum(mat, n, &rc);
for(i = rc.left; i < rc.right; ++i){
for(j = rc.top; j < rc.bottom; ++j)
printf("% 3d ", mat[i][j]);
putchar('\n');
}
printf("sum sub matrix: %d\n", sum);
matrix_free(mat, n);
getchar();
return 0;
}
//поиск квадратной под-матрицы с макс. суммой
int matrix_subsum(int** mat, int n, rect* pr){
rect r;
int i, j, s, m = 0, d = 2;
r.left = r.top = r.right = r.bottom = 0;
*pr = r;
r.right = r.bottom = d;
while(d < n){
s = 0;
for(i = r.left; i < r.right; ++i){
for(j = r.top; j < r.bottom; ++j)
s += mat[i][j];
}
if(s > m){
m = s;
*pr = r;
}
++r.left;
if(++r.right > n){
r.left = 0;
r.right = d;
++r.top;
if(++r.bottom > n){
r.left = r.top = 0;
r.right = r.bottom = ++d;
}
}
}
return m;
}
/* ввод матрицы из файла/консоли, пример:
3
1 2 3
2 3 4
3 3 2 */
int** matrix_input(FILE* _in, int* n){
int** mat, i, j;
*n = 0;
if((_in == NULL) || (fscanf(_in, "%d", n) != 1) || (*n <= 1))
return NULL;
if((mat = matrix_create(*n)) == NULL)
return NULL;
for(i = 0; i < *n; ++i){
for(j = 0; j < *n; ++j){
if((fscanf(_in, "%d", &mat[i][j]) != 1) || (ferror(_in) != 0)){
matrix_free(mat, *n);
return NULL;
}
}
}
return mat;
}
//выделение памяти
int** matrix_create(int n){
int i;
int** mat = (int**)malloc(n * sizeof(int*));
if(mat == NULL)
return NULL;
for(i = 0; i < n; ++i){
mat[i] = (int*)malloc(n * sizeof(int));
if(mat[i] == NULL){
matrix_free(mat, i);
mat = NULL;
break;
}
}
return mat;
}
//освобождение памяти
void matrix_free(int** mat, int n){
int i;
for(i = 0; i < n; ++i)
free(mat[i]);
free(mat);
}