Найти нулевую подматрицу заданного размера и вывести ее на экран - 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