Вы можете сделать это, используя массивы фиксированной длины или массивы переменной длины.
Массивы фиксированной длины
Вы начали с массивов фиксированной длины, поэтому первая программа следует вашему примеру.Вы должны указать второе измерение массивов при их передаче - в противном случае код будет обращаться к неверным данным.Ваш компилятор должен был жаловаться на вызов вашей функции.Я использовал инициализированные данные вместо чтения из стандартного ввода.Входной код закомментирован (и не проверен).
#include <stdio.h>
static int matrica_subset(int m1[][100], int r1, int c1, int m2[][100], int r2, int c2)
{
for (int m = 0; m < r2; m++)
{
for (int n = 0; n < c2; n++)
{
printf("ss: m1[%d][%d] = %d; m2[%d][%d] = %d\n", r1+m, c1+n, m1[r1+m][c1+n], m, n, m2[m][n]);
if (m1[r1+m][c1+n] != m2[m][n])
return 0;
}
}
return 1;
}
static int matrica_sadrzana(int m1[][100], int r1, int c1, int m2[][100], int r2, int c2)
{
if (c1 < c2 || r1 < r2)
return 0;
int c_max = c1 - c2 + 1;
int r_max = r1 - r2 + 1;
for (int r = 0; r < r_max; r++)
{
for (int c = 0; c < c_max; c++)
{
printf("sa: m1[%d][%d] = %d; m2[0][0] = %d\n", r, c, m1[r][c], m2[0][0]);
if (m1[r][c] == m2[0][0])
{
if (matrica_subset(m1, r, c, m2, r2, c2) != 0)
{
printf("match at m1[%d][%d]\n", r, c);
return 1;
}
}
}
}
return 0;
}
int main(void)
{
int sadrzana, c1 = 5, c2 = 2, r1 = 4, r2 = 3;
int matricaA[100][100] =
{
{ 1, 2, 3, 4, 5, },
{ 6, 7, 8, 9, 10, },
{ 11, 12, 13, 14, 15, },
{ 16, 17, 18, 19, 20, },
};
int matricaB[100][100] =
{
{ 2, 3, },
{ 7, 8, },
{ 12, 13, },
};
//printf("rows and columns for matrix A: ");
//scanf("%d %d", &r1, &c1);
//printf("rows and columns for matrix B: ");
//scanf("%d %d", &r2, &c2);
//printf("data for matrix A:\n");
//for (int i = 0; i < r1; i++)
//{
// for (int j = 0; j < c1; j++)
// {
// scanf("%d", &matricaA[i][j]);
// }
//}
//printf("data for matrix B:\n");
//for (int i = 0; i < r2; i++)
//{
// for (int j = 0; j < c2; j++)
// {
// scanf("%d", &matricaB[i][j]);
// }
//}
sadrzana = matrica_sadrzana(matricaA, r1, c1, matricaB, r2, c2);
printf("sadrzana: %d\n", sadrzana);
return 0;
}
Функция matrica_subset()
ищет в m1
, начиная со строки r1
, столбец c1
для совпадения с m2
с размеромr2
активных строк и c2
активных столбцов (небольшое подмножество матрицы 100x100, определенной в main()
).
matrica_sadrzana()
координирует поиск, проверяя, находится ли верхний левый угол m2
соответствует текущей позиции в m1
и продолжает поиск с помощью функции matrica_subset()
при наличии совпадения.
Пример вывода:
sa: m1[0][0] = 1; m2[0][0] = 2
sa: m1[0][1] = 2; m2[0][0] = 2
ss: m1[0][1] = 2; m2[0][0] = 2
ss: m1[0][2] = 3; m2[0][1] = 3
ss: m1[1][1] = 7; m2[1][0] = 7
ss: m1[1][2] = 8; m2[1][1] = 8
ss: m1[2][1] = 12; m2[2][0] = 12
ss: m1[2][2] = 19; m2[2][1] = 13
sa: m1[0][2] = 3; m2[0][0] = 2
sa: m1[0][3] = 4; m2[0][0] = 2
sa: m1[1][0] = 6; m2[0][0] = 2
sa: m1[1][1] = 7; m2[0][0] = 2
sa: m1[1][2] = 8; m2[0][0] = 2
sa: m1[1][3] = 9; m2[0][0] = 2
sadrzana: 0
Массивы переменной длины
Альтернативно использование массивов переменной длины требует дополнительных параметров для функции matrica_subset()
, чтобы указать фактический размер массива (r1
и c1
), а также позицию поиска в массиве (r0
и c0
).
#include <stdio.h>
static void dump_matrix(const char *tag, int r, int c, int m[r][c])
{
printf("%s (%dx%d):\n", tag, r, c);
for (int i = 0; i < r; i++)
{
for (int j = 0; j < c; j++)
printf(" %3d", m[i][j]);
putchar('\n');
}
}
static int matrica_subset(int r1, int c1, int m1[r1][c1], int r0, int c0, int r2, int c2, int m2[r2][c2])
{
for (int m = 0; m < r2; m++)
{
for (int n = 0; n < c2; n++)
{
printf("ss: m1[%d][%d] = %d; m2[%d][%d] = %d\n", r0+m, c0+n, m1[r0+m][c0+n], m, n, m2[m][n]);
if (m1[r0+m][c0+n] != m2[m][n])
return 0;
}
}
return 1;
}
static int matrica_sadrzana(int r1, int c1, int m1[r1][c1], int r2, int c2, int m2[r2][c2])
{
if (c1 < c2 || r1 < r2)
return 0;
int c_max = c1 - c2 + 1;
int r_max = r1 - r2 + 1;
for (int r = 0; r < r_max; r++)
{
for (int c = 0; c < c_max; c++)
{
printf("sa: m1[%d][%d] = %d; m2[0][0] = %d\n", r, c, m1[r][c], m2[0][0]);
if (m1[r][c] == m2[0][0])
{
if (matrica_subset(r1, c1, m1, r, c, r2, c2, m2) != 0)
{
printf("match at m1[%d][%d]\n", r, c);
return 1;
}
}
}
}
return 0;
}
int main(void)
{
int sadrzana, c1 = 5, c2 = 2, r1 = 4, r2 = 3;
int matricaA[4][5] =
{
{ 1, 2, 3, 4, 5, },
{ 6, 7, 8, 9, 10, },
{ 11, 12, 13, 14, 15, },
{ 16, 17, 18, 19, 20, },
};
int matricaB[3][2] =
{
{ 2, 3, },
{ 7, 8, },
{ 12, 13, },
};
//printf("rows and columns for matrix A: ");
//scanf("%d %d", &r1, &c1);
//printf("rows and columns for matrix B: ");
//scanf("%d %d", &r2, &c2);
//printf("data for matrix A:\n");
//for (int i = 0; i < r1; i++)
//{
// for (int j = 0; j < c1; j++)
// {
// scanf("%d", &matricaA[i][j]);
// }
//}
//printf("data for matrix B:\n");
//for (int i = 0; i < r2; i++)
//{
// for (int j = 0; j < c2; j++)
// {
// scanf("%d", &matricaB[i][j]);
// }
//}
dump_matrix("Matrix A", r1, c1, matricaA);
dump_matrix("Matrix B", r2, c2, matricaB);
sadrzana = matrica_sadrzana(r1, c1, matricaA, r2, c2, matricaB);
printf("sadrzana: %d\n", sadrzana);
return 0;
}
Пример вывода:
Matrix A (4x5):
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
Matrix B (3x2):
2 3
7 8
12 13
sa: m1[0][0] = 1; m2[0][0] = 2
sa: m1[0][1] = 2; m2[0][0] = 2
ss: m1[0][1] = 2; m2[0][0] = 2
ss: m1[0][2] = 3; m2[0][1] = 3
ss: m1[1][1] = 7; m2[1][0] = 7
ss: m1[1][2] = 8; m2[1][1] = 8
ss: m1[2][1] = 12; m2[2][0] = 12
ss: m1[2][2] = 13; m2[2][1] = 13
match at m1[0][1]
sadrzana: 1
Сюрприз, сюрприз - он возвращает тот же результат.Функции поиска работают с массивами переменной длины;данные по-прежнему хранятся в массивах фиксированного размера (поскольку вы не можете использовать инициализатор для VLA), но размеры значительно меньше, чем в исходном коде.
Код VLA также сбрасывает входные матрицы;код FLA нет.Довольно просто добавить код дампа в первую программу, но функция печати не такая общая.Можно было бы организовать вывод подсегмента NxM матрицы RxC;это немного неудобно для кода, но очень универсально и может использоваться в обеих программах - но программа VLA просто установит N и R равными, а M и C равными.