0

好吧,所以我认为我的代码正在工作,而且似乎确实如此,它允许用户选择一个幻方的大小,其中第一个是起点并从第一行的中心开始。图案沿着这条线走……如果你向上超过第一行……回到最后一行,或者如果你跑出列右侧的末端而不是回到列的开头......如果您不熟悉它,那么在魔方中,当计算该边或对角线上的数字时,所有边都是相等的。

必须输入一个奇数才能将其写为幻方(例如:3x3、5x5、7x7 等)。问题是它在我输入 11x11 之前一直有效……完成后,它又回来了当程序运行到一个已经被填满的插槽时,它应该在输入到数组中的最后一个数字下方输入下一个数字......但是当输入 11x11 时,它会用 13 覆盖 1 从而中断循环和破坏了模式....如果有人帮助我,我将不胜感激,我认为问题可能与我用来选择起点的方程式有关。这一直有效到 11x11,之后输入的每个奇数似乎都会覆盖起点。

    // Chapter 8 Programming Project #17

    #include <stdio.h>

    #define N_squared (N * N)
    #define MOVE (--row, ++column)
    #define RW_SIZE ((int) (sizeof(magic_square) / sizeof(magic_square[0])))

    void create_magic_square(int N, int magic_square[N][N], int ROW_SIZE);
    void print_magic_square(int N, int magic_square[N][N], int ROW_SIZE);

    int main(void)
    {
        int N, row, column;

        printf("This program creates a magic square of a specified size\n");
        printf("The size must be an odd number between 1 and 99.\n");
        printf("Enter size of magic square: ");
        scanf("%d", &N);
        int magic_square[N][N];
        for (row = 0; row < N; row++) {
            for (column = 0; column < N; column++) {
                magic_square[row][column] = 0;
            }
        }
        // Create magic square
        create_magic_square(N, magic_square, RW_SIZE);
        // Print magic square
        print_magic_square(N, magic_square, RW_SIZE);

        return 0;
    }

    void create_magic_square(int N, int magic_square[N][N], int ROW_SIZE)
    {
        printf("Size of N*N = %d\nSize of ROW_SIZE = %d\n", N_squared, ROW_SIZE);
        // Here I iterate through the numbers, rows, and columns
        int i = 1, row = 0;
        int column = (((ROW_SIZE + 1) / 2) - 1);

        while (i != N_squared + 1){
            // if new position is empty place next number
            if (magic_square[row][column] == 0) {
                magic_square[row][column] = i;
                i++;
            // If new position is filled then move back and down
            } else if (row + 2 < ROW_SIZE &&
                       column - 1 >= 0) {
                row += 2;
                column -= 1;
            } else if (row + 2 > ROW_SIZE - 1 &&
                       column - 1 < 0) {
                row = 1;
                column = ROW_SIZE - 1;
            }
            // If current position has been set then move
            if (magic_square[row][column] != 0)
                MOVE;
            // If row runs off the board reset
            if (row < 0)
                row = ROW_SIZE - 1;
            // if column runs off the board reset
            if (column > ROW_SIZE - 1)
                column = 0;
        }
    }

    void print_magic_square(int N, int magic_square[N][N], int ROW_SIZE)
    {
        int row, column;
        printf("\n");
        for (row = 0; row < ROW_SIZE; row++) {
            for (column = 0; column < ROW_SIZE; column++) {
                if (N > 9)
                    printf(" %3d ", magic_square[row][column]);
                else
                    printf(" %2d ", magic_square[row][column]);
            }
            printf("\n\n");
        }
    }
4

0 回答 0