Найти нулевую подматрицу заданного размера и вывести ее на экран - 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; }
Объяснение кода листинга программы
- Подключение необходимых библиотек для работы с матрицами и вывода данных на экран
- Объявление функции find_msub, которая ищет подматрицу заданного размера с заданными условиями
- Объявление статических функций cmp_zero и cmp_odd, которые проверяют число на ноль и на чётность соответственно
- В функции main создаётся матрица mat размером N на M (4 на 6)
- Задаются размеры подматрицы n и m (2 и 3 соответственно)
- Вызывается функция find_msub, которая ищет подматрицу заданного размера с заданными условиями и выводит её на экран
- Выводится подматрица из нулей матрицы mat
- Выводится подматрица из нечётных чисел матрицы mat
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д