8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

用 C 编写的最大的螺旋子矩阵程序没有返回预期的结果

user25653727 2月前

33 0

我的程序应该返回最大的螺旋子矩阵。对于值为 [[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 时它会返回它,这不应该发生。

这是我第一次在这里提问,所以如果我的问题形式不正确,我提前道歉。

帖子版权声明 1、本帖标题:用 C 编写的最大的螺旋子矩阵程序没有返回预期的结果
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由user25653727在本站《c》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 我在 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])。这样,我的矩阵的大小保持不变,正如它应该的那样,并且子矩阵的限制是可变的。

返回
作者最近主题: