幻方问题。
我的代码如下,如有错误,恳请指正:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
#include <stdio.h> #define N 99 void create_magic_square(int n,int magic_square[N][N]); void print_magic_square(int n,int magic_suqre[N][N]); int main(void) { int n; conti: 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: \n"); scanf("%d",&n);//获取幻方的大小。 printf("\n"); if ( n % 2 == 0 || n > 99) { printf("Illegal input!\n\n"); goto conti;//按照题目要求输入99以内的奇数,如果不满足条件,则继续输入。 } int magic_square[N][N];//假设幻方大小为99*99。 create_magic_square(n,magic_square); print_magic_square(n,magic_square);//输出幻方。 return 0; } void create_magic_square(int n,int magic_square[N][N]) { int x,y,mid,max,i,flag[N][N] = {0}; //flag数组用来标识被占用的数组。 //全部初始化为0,每占用一个,把1赋给相应的flag。 int sx,sy; //sx和sy用来存储每次循环前x和y的位置。 //如果遇到要走的位子被占的情况下,可以直接 //在原来的sx和sy的基础上移动。向下移动即y+1。 //(因为在下面的运算过程中,会改变x和y的值) //sx和sy是为了下一步位子被占的情况准备的。 mid = n / 2;//奇数除以二得中间的位子。 max = n * n;//幻方中数字的最大值。 x = mid; y = 0;//初始化x,y。 magic_square[x][y] = 1;//使第0行中间一个数字为1。 flag[x][y] = 1;//标识第0行中间一个数字已经被占用。 for (i = 2;i <= max;i++)//从2开始循环,一直到max循环结束。 { sx = x; sy = y; if ( (x + 1) > (n - 1)) { x = 0; }//如果越界,则绕回。 else { x = x + 1; }//如果没有越界,则继续。 if ( (y - 1) < 0) { y = n - 1; } else { y = y - 1; } if (flag[x][y] == 0) { magic_square[x][y] = i; flag[x][y] = 1; }//对于没有被占用位子的情况进行操作。 else { x = sx; y = sy; y = y + 1; magic_square[x][y] = i; flag[x][y] = 1; }//对于下一步位子被占用的情况进行操作。 } } void print_magic_square(int n,int magic_square[N][N]) { int x,y; for (y = 0;y < n;y++) { for (x = 0;x < n;x++) { printf("%3d",magic_square[x][y]); } printf("\n");//每n行,一个换行符。 }//输出幻方。 } |