わかりましたので、私のコードは機能していると思いましたが、そのように見えます。ユーザーは、1 番が開始点であり、最初の行の中央から始まる魔方陣のサイズを選択できます。パターンはこの線に沿って進みます....1 つ上に移動します.最初の行の上に移動する場合....最後の行に戻るか、列の右側の端から外れると.列の最初に戻るよりも...魔方陣に慣れていない場合は、その辺または対角線の数字が数えられると、すべての辺が等しくなります。
これを魔方陣として書き出すには、奇数を入力する必要があります (例: 3x3、5x5、7x7 など)。問題は、11x11 を入力するまで機能することです。プログラムがすでに満たされたスロットに実行されると、配列に入力された最後の番号の下に次の番号を入力することになっています...しかし、11x11 が入力されると、1 が 13 で上書きされ、サイクルが中断されます。パターンを台無しにします....誰かがこれを手伝ってくれたら幸いです。問題は、開始点を選択するために使用する方程式に関係していると思います。これは 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");
}
}