Моя программа должна возвращать самую большую спиральную подматрицу. Для матрицы 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 во втором вложении, чего не должно быть. .
Я впервые задаю здесь вопрос, поэтому заранее извиняюсь, если мой вопрос не имеет правильной формы.
Я поставил точку останова на printSpiral, и все шло хорошо, пока для подматрицы (одна, хранящаяся в mat2 = {{1,2}, {4,3}}) она не вызвала isSpiral, а в isSpiral примерно в втором цикле for она каким-то образом не достигла возврата 0, что должно было в этом случае это невозможно. Надеюсь, это прояснит ситуацию.
Проблема заключалась в том, как я объявлял параметры своих функций.
Здесь я создал 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]
) в аргументе функции, предназначен только для вас. Компилятор может выдать предупреждения, если вы пренебрегаете максимальным размером, если он обнаружит это во время компиляции, но на самом деле это никогда не повлияет на то, что делает ваша программа.
Когда вы выполняете программу в отладчике за один шаг, в какой момент она в первую очередь делает то, чего вы не хотите?