魔方阵算法

输出"魔方阵"。所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。例如,三阶魔方阵为
      8 1 6
      3 5 7
      4 9 2
要求输出1~n*n的自然数构成的魔方阵。
解:魔方阵中各数的排列规律如下:
(1)将1放在第1行的中间一列。
(2)从2开始直到n×n止各数依次按下列规则存放:每一个数存放的行比前一个数的行数减1,列数加1(例如上面的三阶魔方阵,5在4的上一行后一列).
(3)如果上一数的行数为1,则下一个数的行数为n(指最下一行)。例如,1在第一行,则2应放在最下一行,列数同样加1. 
(4)当上一个数的列数为n时,下一个数的列数应为1,行数减1.例如,2在第3行最后一列,则3应放在第2行第1列。
(5)如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。例如,按上面的规定,4应该放在第1行第2列,但该位置已经被1占据,
所以4就放在3的下面。7应该放在第3行第1列,但该位置已经被4占据,故7放在6下面。
按此方法可以得到任何阶的魔方阵。

注意:魔方阵的阶数应奇数,程序指定其最大值为15。今定义数组a为16行16列,对第0行0列不用来存放数据,只用第1~15行,使读者看程序时比较符合习惯。

 

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #define SIZE 50;
 4 main()
 5 {
 6     int row, col, n, value;
 7     int a[SIZE+1][SIZE+1];              
 8     printf("请输入要输出魔方阵的阶数n(奇数, <%d):n=",SIZE);
 9     scanf("%d",&n);
10     if(!(n%2)||n<1||n==0) 
11     {
12         printf("输入有误!\n");
13         exit(0);
14     }
15 row = 1; col = (n+1)/2; value = 1;
16     while(value<=n*n) 
17     {
18         a[row][col] = value;
19         if(value%n!=0)
20         {
21             row--;
22             col++; 
23             if(row<1)
24                 row=3;
25             if(col>n)
26                 col=1; 
27         }
28         else
29             row++;
30         value=value+1; 
31     }
32     printf("\n%d 阶魔方阵如下所示:\n\n",n);
33     for(row = 1; row <= n; row++)
34     {
35         for(col = 1; col <= n; col++)
36         printf("%5d",a[row][col]);
37         printf("\n");
38     }
39 }
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
原文地址:https://www.cnblogs.com/wspaceworld/p/2492635.html