Найти нулевую подматрицу заданного размера и вывести ее на экран - C (СИ)

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

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

Доброго времени суток, программа должна найти нулевую подматрицу заданного размера и вывести ее на экран. Много всего пробовал, но идеи уже закончились, как и нервы Помогите пожалуйста с телом поиска. То, что есть сейчас:
#include <stdio.h>
#include <stdlib.h>
 
#define N 4
#define Q 16
#define M 4
 
void input(int a[N][M]);
void output(int a[N][M]);
 
int main()
{
    int a[N][M],col=0, i, j, i1, j1, tmp, tmp1,r;
    input(a);
    printf("€б室*л© ¬*ббЁў\n");
    output(a);
    printf("\n");
  for (i=0; i<N; i++)
  {
   for (j=0; j<M; j++)
   { 
         if(a[i][j]==0)
          {
              
          }
      }
  }
   system("pause>>0");
    return 0;
}
void input(int a[N][M])
{
    int i, j;
    for (i = 0; i<N; i++)
    {
        for (j = 0; j<M; j++)
        {
            printf("a[%d][%d]= ",i,j);
            scanf("%d",&a[i][j]);
        }
    }
}
void output(int a[N][M])
{
    int i, j;
    for (i = 0; i<N; i++)
    {
        for (j = 0; j <M; j++)
            printf("%4d", a[i][j]);
        printf("\n");
    }
}

Решение задачи: «Найти нулевую подматрицу заданного размера и вывести ее на экран»

textual
Листинг программы
#include <stdio.h>
#define N 4
#define M 6
 
int find_msub(const int mat[][M], int n, int m, int (*cmp)(int), int* prow){
    int i, j, a, b, rows, cols;
    for(i = 0; (i < N) && ((i + n) <= N); ++i){
        for(j = 0; (j < M) && ((j + m) <= M); ++j){
            rows  = i + n;
            cols  = j + m;
            for(a = i; a < rows; ++a){
                for(b = j; b < cols; ++b){
                    if(! (*cmp)(mat[a][b]))
                        goto _break;
                }
            }
            if(a == rows){
                *prow = i;
                return j;
            }
_break:;
        }
    }
    *prow = -1;
    return -1;
}
 
static int cmp_zero(int n) { return (n == 0); }
static int cmp_odd(int n)  { return ((n % 2) != 0); }
 
int main(void){
    int i, j, n, m, x, y;
    
    int mat[N][M] = {
        { 1, 2, 3, 4, 7, 8 },
        { 1, 7, 5, 1, 2, 3 },
        { 3, 9, 1, 0, 0, 0 },
        { 5, 3, 3, 0, 0, 0 }
    };
    
    //найти нулевую под матрицу
    n = 2;
    m = 3;
    x = find_msub(mat, n, m, cmp_zero, &y);
    if(x != -1){
        for(i = y; i < (y + n); ++i){
            for(j = x; j < (x + m); ++j)
                printf("%d ", mat[i][j]);
            putchar('\n');
        }
    }
    putchar('\n');
 
    //ещё пример найти под матрицу из нечётных чисел
    n = m = 3;
    x = find_msub(mat, n, m, cmp_odd, &y);
    if(x != -1){
        for(i = y; i < (y + n); ++i){
            for(j = x; j < (x + m); ++j)
                printf("%d ", mat[i][j]);
            putchar('\n');
        }
    }
    return 0;
}

Объяснение кода листинга программы

  1. Подключение необходимых библиотек для работы с матрицами и вывода данных на экран
  2. Объявление функции find_msub, которая ищет подматрицу заданного размера с заданными условиями
  3. Объявление статических функций cmp_zero и cmp_odd, которые проверяют число на ноль и на чётность соответственно
  4. В функции main создаётся матрица mat размером N на M (4 на 6)
  5. Задаются размеры подматрицы n и m (2 и 3 соответственно)
  6. Вызывается функция find_msub, которая ищет подматрицу заданного размера с заданными условиями и выводит её на экран
  7. Выводится подматрица из нулей матрицы mat
  8. Выводится подматрица из нечётных чисел матрицы mat

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


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

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

5   голосов , оценка 3.6 из 5
Похожие ответы