You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
1.2 KiB
62 lines
1.2 KiB
#include <stdio.h>
|
|
|
|
void create_magic_square(int n, char magic_square[n][n]);
|
|
void print_magic_square(int n, char magic_square[n][n]);
|
|
|
|
int main(void) {
|
|
int n = 0;
|
|
|
|
printf("Magic square of specified size.\n");
|
|
|
|
while (n % 2 != 1) {
|
|
printf("Enter odd number between 1 and 99: ");
|
|
scanf("%2d", &n);
|
|
}
|
|
|
|
char magic_square[n][n];
|
|
create_magic_square(n, magic_square);
|
|
print_magic_square(n, magic_square);
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
void create_magic_square(int n, char magic_square[n][n]) {
|
|
short i, r, c, prevr, prevc;
|
|
for (r = 0; r < n; r++)
|
|
for (c = 0; c < n; c++)
|
|
magic_square[r][c] = 0;
|
|
|
|
// Put 1 into first row, middle column
|
|
r = prevr = 0;
|
|
c = prevc = n / 2;
|
|
i = 1;
|
|
do {
|
|
// Wrap over row
|
|
if (r == -1)
|
|
r = n - 1;
|
|
// Wrap over column
|
|
if (c == n)
|
|
c = 0;
|
|
// If element already occupied, put new right below previous placed
|
|
if (magic_square[r][c] != 0) {
|
|
r = prevr + 1;
|
|
c = prevc;
|
|
}
|
|
prevr = r;
|
|
prevc = c;
|
|
// Move one row up and to to the next column
|
|
magic_square[r--][c++] = i++;
|
|
} while (i <= (n * n));
|
|
}
|
|
|
|
|
|
void print_magic_square(int n, char magic_square[n][n]) {
|
|
short r, c;
|
|
for (r = 0; r < n; r++) {
|
|
for (c = 0; c < n; c++) {
|
|
printf("%4hd", magic_square[r][c]);
|
|
}
|
|
printf("\n");
|
|
}
|
|
}
|
|
|