Самая большая программа спиральной подматрицы, написанная на C, не возвращает ожидаемого результата

Моя программа должна возвращать самую большую спиральную подматрицу. Для матрицы 2x2 со значениями [[1,2], [4,3]] она возвращает подматрицу 2x2 с теми же значениями (как и должно быть), но когда я ввожу матрицу 2x3 со значениями [[1,2,5], [4 ,3,9]] он ничего не возвращает, просто печатает, что спиральных подматриц нет.

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<string.h>

void printMat(int n, int m, int mat[n][m]);
int isSpiral(int n, int m, int mat[n][m]);
void printSpiral(int n, int m, int mat[n][m]);
void copyMat(int n, int m, int mat[n][m], int mat2[n][m]);

int main(void) {
    int n, m;
    printf("Enter number of rows and columns: \n");
    scanf("%d %d", &n, &m);
    int mat[n][m];
    printf("Enter %d elements of matrix: \n", n * m);
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < m; j++) {
            scanf("%d", &mat[i][j]);
        }
    }
    printMat(n, m, mat);
    printSpiral(n, m, mat);
    return 0;
}

void printMat(int n, int m, int mat[n][m]) {
    printf("\n");
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < m; j++) {
            printf("%5d", mat[i][j]);
        }
        printf("\n");
    }
}

int isSpiral(int n, int m, int mat[n][m]) {
    int k = 0;

        for(int i = 0; i <= n / 2 && k < n * m; i++) {

             if ((i > 0) && (mat[i][i] - mat[i][i - 1] != 1))
                return 0;
            else
                k++;

            for(int j = i; j < m - 1 - i && k < n * m; j++) {
                k++;
                if (mat[i][j + 1] - mat[i][j] != 1)
                    return 0;
            }

            for(int j = i; j < n - 1 - i && k < n * m; j++) {
                k++;
                if (mat[j + 1][m - 1 - i] - mat[j][m - 1 - i] != 1)
                    return 0;
            }

            for(int j = i; j < m - 1 - i && k < n * m; j++) {
                k++;
                if (mat[n - 1 - i][j] - mat[n - 1 - i][j + 1] != 1)
                    return 0;
            }

            for(int j = i + 1; j < n - 1 - i && k < n * m; j++) {
                k++;
                if (mat[j][i] - mat[j + 1][i] != 1)
                    return 0;
            }
        }
    return 1;
}

void copyMat(int n, int m, int mat[n][m], int mat2[n][m]) {
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < m; j++) {
            mat2[i][j] = mat[i][j];
        }
    }
}

void printSpiral(int n, int m, int mat[n][m]) {
    int mat3[n][m], i2 = 0, j2 = 0;
    int maxi2 = -1, maxj2 = -1;
    int mat2[n][m];

    for(int g = n; g > 1; g--) {

        for(int f = m; f > 1; f--) {

            for(int k = 0; k < g - 1; k++) {

                for(int l = 0; l < f - 1; l++) {

                    i2 = 0;
                    for(int i = k; i < g; i++) {
                        j2 = 0;
                        for(int j = l; j < f; j++) {
                            mat2[i2][j2] = mat[i][j];
                            j2++;
                        }
                        i2++;
                    }

                if (isSpiral(i2, j2, mat2)) {
                    if (i2 >= maxi2 && j2 >= maxj2) {
                        maxi2 = i2;
                        maxj2 = j2;
                        copyMat(maxi2, maxj2, mat2, mat3);
                    }
                }
                }
            }
        }
    }

    if (maxi2 > 0 && maxj2 > 0)
        printMat(maxi2, maxj2, mat3);
    else
        printf("\nNo spiral submatrix");
}

Я пробовал его отлаживать, но это не сильно помогло. Я заметил, что когда он вызывает функцию isSpiral из функции printSpiral, он возвращает 0 для подматрицы [[1,2], [4,3]] и возвращает его, когда переменная k равна 3 во втором вложении, чего не должно быть. .

Я впервые задаю здесь вопрос, поэтому заранее извиняюсь, если мой вопрос не имеет правильной формы.

Когда вы выполняете программу в отладчике за один шаг, в какой момент она в первую очередь делает то, чего вы не хотите?

Eric Postpischil 30.08.2024 01:27

Я поставил точку останова на printSpiral, и все шло хорошо, пока для подматрицы (одна, хранящаяся в mat2 = {{1,2}, {4,3}}) она не вызвала isSpiral, а в isSpiral примерно в втором цикле for она каким-то образом не достигла возврата 0, что должно было в этом случае это невозможно. Надеюсь, это прояснит ситуацию.

Kristijan Vuković 30.08.2024 03:06
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема заключалась в том, как я объявлял параметры своих функций.

Здесь я создал isSpiral(int n, int m, int mat[n][m]), и проблема была в int mat[n][m], потому что n и m меняли размер моей переменной mat (матрицы).

Если бы размер был изменен, функция получила бы неправильные индексы, поэтому я просто добавил два новых параметра: int i2 и int j2:

isSpiral(int n, int m, int i2, int j2, int mat[i2][j2]).

Таким образом, размер моей матрицы остается неизменным, постоянным, как и должно быть, а пределы для подматриц являются переменными.

Это только изменило то, что ваша программа считала размером массива. Передача массива в качестве аргумента функции всегда будет передавать его как указатель на массив. Размер, который вы указываете (n и m в mat[n][m]) в аргументе функции, предназначен только для вас. Компилятор может выдать предупреждения, если вы пренебрегаете максимальным размером, если он обнаружит это во время компиляции, но на самом деле это никогда не повлияет на то, что делает ваша программа.

Tenobaal 03.09.2024 18:38

Другие вопросы по теме