该程序通过Merzirac法生成奇阶幻方
在第一行居中的方格内放1,依次向左上方填入2、3、4…,如果左上方已有数字,则向下移一格继续填写。如下图用Merziral法生成的5阶幻方:
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
#include < stdio.h >
#include < alloc.h >
void main()
{
int ** a; /* 定义一个指针指向二维数组 */
int n,i,j,num;
clrscr();
printf( " enter a odd number: " );
scanf( " %d " , & n); /* 输入一个幻方阶数,为奇数 */
while (n % 2 == 0 )
{
printf( " enter a odd number: " );
scanf( " %d " , & n);
}
a = ( int ** )malloc(n * sizeof ( int * )); /* **************************************** */
for (i = 0 ;i < n;i ++ ) /* 生成动态二维数组(n*n方阵) */
a[i] = ( int * )malloc(n * sizeof ( int )); /* **************************************** */
for (i = 0 ;i < n;i ++ )
{
for (j = 0 ;j < n;j ++ )
{
a[i][j] = 0 ;
}
}
a[ 0 ][n / 2 ] = 1 ; /* 初始化第一行中间数字为1 */
num = 1 ;i = 0 ;j = n / 2 ;
while (num < n * n) /* 幻方求解 */
{
if (a[(n + i - 1 ) % n][(n + j - 1 ) % n] != 0 )
{
a[i + 1 ][j] =++ num;
i ++ ;
}
else
{
a[(n + i - 1 ) % n][(n + j - 1 ) % n] =++ num;
i = (n + i - 1 ) % n;j = (n + j - 1 ) % n;
}
}
for (i = 0 ;i < n;i ++ ) /* 输出 */
{
for (j = 0 ;j < n;j ++ )
printf( " %4d " ,a[i][j]);
printf( " " );
}
}