Функция получающая как параметер Матрицу целых чисел 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
Листинг программы
- #include <stdio.h>
- #define N 5
- typedef struct {
- int row, col, size;
- } mres;
- static int is_cmp(int m[][N], int i0, int j0, int i1, int j1);
- int mfind_sub(int m[][N], mres* r);
- int main(void){
- int i, j;
- mres r;
- int m[N][N] = {
- { 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 }
- };
- if(mfind_sub(m, &r)){
- printf("Max zero matrix: Start[%d, %d], Size=%d, Zeros=%d.\n",
- r.row, r.col, r.size, r.size * r.size);
- // для результата поиска вывести наглядный результат
- for(i = r.row; i < r.row + r.size; ++i){
- for(j = r.col; j < r.col + r.size; ++j)
- m[i][j] = 8;
- }
- for(i = 0; i < N; ++i){
- for(j = 0; j < N; ++j)
- putchar(m[i][j] + '0');
- putchar('\n');
- }
- } else
- puts("error find!");
- return 0;
- }
- int mfind_sub(int m[][N], mres* r){
- int i, j, i1, j1, a, b, n;
- r->size = r->col = r->row = 0;
- for(i = 0; i < N; ++i){
- for(j = 0; j < N; ++j){
- if(m[i][j] != 0)
- continue;
- i1 = i;
- while((i1 < N) && (m[i1][j] == 0))
- ++i1;
- if((a = (i1 - i)) <= 1)
- continue;
- j1 = j;
- while((j1 < N) && (m[i][j1] == 0))
- ++j1;
- if((b = (j1 - j)) <= 1)
- continue;
- n = (a < b) ? a : b;
- if(n <= 1)
- continue;
- for(; n > 1; --n, --i1, --j1){
- if(is_cmp(m, i, j, i1, j1)){
- if(n > r->size){
- r->size = n;
- r->col = j;
- r->row = i;
- }
- break;
- }
- }
- if(r->size == N){
- i = N;
- break;
- }
- }
- }
- return (r->size > 0);
- }
- static int is_cmp(int m[][N], int i0, int j0, int i1, int j1){
- int i, j;
- for(i = i0; i < i1; ++i){
- for(j = j0; j < j1; ++j){
- if(m[i][j] != 0)
- return 0;
- }
- }
- return 1;
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д