Функция получающая как параметер Матрицу целых чисел NxN и количество ее строк - C (СИ)

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

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

Доброго времени суток друзья, вопрос такой. мне надо написать функцию получающую матрицу NxN и количество ее строк(количество строк ровно количеству столбиков). функция выдает на экране данные( первый индекс, количество строк и число данных) квадратной максимальной под-матрицы в которой только нули. пример: матрица 5x5 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 0 1 1 1 1 1 вывод на экран: Max zero matrix: Start[0,2], Size=3, Zeros=9. заранее спасибо.

Решение задачи: «Функция получающая как параметер Матрицу целых чисел NxN и количество ее строк»

textual
Листинг программы
  1. #include <stdio.h>
  2. #define N  5
  3.  
  4. typedef struct {
  5.     int row, col, size;
  6. } mres;
  7.  
  8. static int is_cmp(int m[][N], int i0, int j0, int i1, int j1);
  9. int mfind_sub(int m[][N], mres* r);
  10.  
  11. int main(void){
  12.     int  i, j;
  13.     mres r;
  14.     int m[N][N] = {
  15.         { 0, 0, 0, 0, 0 },
  16.         { 0, 0, 0, 0, 0 },
  17.         { 1, 1, 0, 0, 0 },
  18.         { 1, 1, 0, 0, 0 },
  19.         { 1, 1, 1, 1, 1 }
  20.     };
  21.  
  22.     if(mfind_sub(m, &r)){
  23.         printf("Max zero matrix: Start[%d, %d], Size=%d, Zeros=%d.\n",
  24.                r.row, r.col, r.size, r.size * r.size);
  25.  
  26.         // для результата поиска вывести наглядный результат
  27.         for(i = r.row; i < r.row + r.size; ++i){
  28.             for(j = r.col; j < r.col + r.size; ++j)
  29.                 m[i][j] = 8;
  30.         }
  31.  
  32.         for(i = 0; i < N; ++i){
  33.             for(j = 0; j < N; ++j)
  34.                 putchar(m[i][j] + '0');
  35.             putchar('\n');
  36.         }
  37.     } else
  38.         puts("error find!");
  39.     return 0;
  40. }
  41.  
  42. int mfind_sub(int m[][N], mres* r){
  43.     int i, j, i1, j1, a, b, n;
  44.  
  45.     r->size = r->col = r->row = 0;
  46.     for(i = 0; i < N; ++i){
  47.         for(j = 0; j < N; ++j){
  48.             if(m[i][j] != 0)
  49.                 continue;
  50.            
  51.             i1 = i;
  52.             while((i1 < N) && (m[i1][j] == 0))
  53.                 ++i1;
  54.                
  55.             if((a = (i1 - i)) <= 1)
  56.                 continue;
  57.  
  58.             j1 = j;
  59.             while((j1 < N) && (m[i][j1] == 0))
  60.                 ++j1;
  61.  
  62.             if((b = (j1 - j)) <= 1)
  63.                 continue;
  64.  
  65.             n = (a < b) ? a : b;
  66.             if(n <= 1)
  67.                 continue;
  68.  
  69.             for(; n > 1; --n, --i1, --j1){
  70.                 if(is_cmp(m, i, j, i1, j1)){
  71.                     if(n > r->size){
  72.                         r->size = n;
  73.                         r->col  = j;
  74.                         r->row  = i;
  75.                     }
  76.                     break;
  77.                 }
  78.             }
  79.  
  80.             if(r->size == N){
  81.                 i = N;
  82.                 break;
  83.             }
  84.         }
  85.     }
  86.     return (r->size > 0);
  87. }
  88.  
  89. static int is_cmp(int m[][N], int i0, int j0, int i1, int j1){
  90.     int i, j;
  91.     for(i = i0; i < i1; ++i){
  92.         for(j = j0; j < j1; ++j){
  93.             if(m[i][j] != 0)
  94.                 return 0;
  95.         }
  96.     }
  97.     return 1;
  98. }

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


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

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

13   голосов , оценка 3.923 из 5

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

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

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