В матрице найти подматрицу, у которой самая высокая сумма все чисел - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток, тут такое вот дело, надо написать функция котороая ищет из квадратной матрицы(двойной массив) маленькую квадратную матрицу у которой саммая высокая сумма все чисел.функция выведит на экран данные начала под матрицы и ее сумму. функция получает массив и его размер. заранее спасибо)

Решение задачи: «В матрице найти подматрицу, у которой самая высокая сумма все чисел»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <malloc.h>
  3.  
  4. typedef struct {
  5.     int left, top, right, bottom;
  6. } rect;
  7.  
  8. int** matrix_create(int n);
  9. void  matrix_free(int** mat, int n);
  10. int** matrix_input(FILE* _in, int* n);
  11. int   matrix_subsum(int** mat, int n, rect* pr);
  12.  
  13.  
  14. int main(void){
  15.     int  i, j, sum, **mat, n;
  16.     rect rc;
  17. /*  ввод из файла
  18.     FILE* fp = fopen("file.txt", "rt");
  19.     mat = matrix_input(fp, &n);
  20.     fclose(fp);
  21. */
  22.     mat = matrix_input(stdin, &n);
  23.     if(mat == NULL)
  24.         return 1;
  25.     putchar('\n');
  26.  
  27.     sum = matrix_subsum(mat, n, &rc);
  28.     for(i = rc.left; i < rc.right; ++i){
  29.         for(j = rc.top; j < rc.bottom; ++j)
  30.             printf("% 3d ", mat[i][j]);
  31.         putchar('\n');
  32.     }
  33.     printf("sum sub matrix: %d\n", sum);
  34.  
  35.     matrix_free(mat, n);
  36.     getchar();
  37.     return 0;
  38. }
  39.  
  40. //поиск квадратной под-матрицы с макс. суммой
  41. int matrix_subsum(int** mat, int n, rect* pr){
  42.     rect r;
  43.     int  i, j, s, m = 0, d = 2;
  44.  
  45.     r.left  = r.top = r.right = r.bottom = 0;
  46.     *pr = r;
  47.     r.right = r.bottom = d;
  48.  
  49.     while(d < n){
  50.         s = 0;
  51.         for(i = r.left; i < r.right; ++i){
  52.             for(j = r.top; j < r.bottom; ++j)
  53.                 s += mat[i][j];
  54.         }
  55.         if(s > m){
  56.             m   = s;
  57.             *pr = r;
  58.         }
  59.  
  60.         ++r.left;
  61.         if(++r.right > n){
  62.             r.left  = 0;
  63.             r.right = d;
  64.             ++r.top;
  65.             if(++r.bottom > n){
  66.                 r.left  = r.top    = 0;
  67.                 r.right = r.bottom = ++d;
  68.             }
  69.         }
  70.     }
  71.     return m;
  72. }
  73.  
  74. /* ввод матрицы из файла/консоли, пример:
  75.    3
  76.    1 2 3
  77.    2 3 4
  78.    3 3 2  */
  79. int** matrix_input(FILE* _in, int* n){
  80.     int** mat, i, j;
  81.     *n = 0;
  82.     if((_in == NULL) || (fscanf(_in, "%d", n) != 1) || (*n <= 1))
  83.         return NULL;
  84.  
  85.     if((mat = matrix_create(*n)) == NULL)
  86.         return NULL;
  87.    
  88.     for(i = 0; i < *n; ++i){
  89.         for(j = 0; j < *n; ++j){
  90.             if((fscanf(_in, "%d", &mat[i][j]) != 1) || (ferror(_in) != 0)){
  91.                 matrix_free(mat, *n);
  92.                 return NULL;
  93.             }
  94.         }
  95.     }
  96.     return mat;
  97. }
  98.  
  99. //выделение памяти
  100. int** matrix_create(int n){
  101.     int   i;
  102.     int** mat = (int**)malloc(n * sizeof(int*));
  103.     if(mat == NULL)
  104.         return NULL;
  105.  
  106.     for(i = 0; i < n; ++i){
  107.         mat[i] = (int*)malloc(n * sizeof(int));
  108.         if(mat[i] == NULL){
  109.             matrix_free(mat, i);
  110.             mat = NULL;
  111.             break;
  112.         }
  113.     }
  114.     return mat;
  115. }
  116.  
  117. //освобождение памяти
  118. void matrix_free(int** mat, int n){
  119.     int i;
  120.     for(i = 0; i < n; ++i)
  121.         free(mat[i]);
  122.     free(mat);
  123. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.2 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы