我的程序应该返回最大的螺旋子矩阵。对于值为 [[1,2], [4,3]] 的 2x2 矩阵,它返回具有相同值的 2x2 子矩阵(应该如此),但是当我输入值为 [[...
我的程序应该返回最大的螺旋子矩阵。对于值为 [[1,2], [4,3]] 的 2x2 矩阵,它返回具有相同值的 2x2 子矩阵(应该如此),但是当我输入值为 [[1,2,5], [4,3,9]] 的 2x3 矩阵时,它不返回任何内容,只是打印没有螺旋子矩阵。
#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");
}
我尝试调试它,但没什么帮助。我注意到,当它从 printSpiral 函数调用 isSpiral 函数时,它会为 [[1,2], [4,3]] 子矩阵返回 0,并且当变量 k 在第二个嵌套 for 中等于 3 时它会返回它,这不应该发生。
这是我第一次在这里提问,所以如果我的问题形式不正确,我提前道歉。