魔方阵是我国古代发明的一种数字游戏:n阶魔方是指这样一种方阵,他的每一列、每一行以及对角线上的的各数之和为一个相同的常数,这个常数是:n*(n*n+1)/2,此常数被称为魔方阵常数。由于偶次阶魔方阵(n=偶数)求解起来比较困难,这里只考虑n为奇数的情况。
一下就是一个魔方阵:
6 1 8
7 5 3
2 9 4
他的各行、各列以及对角线上的元素之和为15
问题分析:如果采用穷举法,对数据的各种分布进行判断是否满足魔方阵条件,那么当n较大时,及使用计算机也需要很长时间才能找出解来。
算法设计:有趣的是如果将1,2,…n*n,按某种规则填入到方阵中,得到的恰好是奇次魔方阵,这个规则可以描述如下:
(1) 首先将1填在方阵第一行的中间,即(1,(n+1)/2)的位置。
(2) 下一个数填在上一个数的主对角线的上方,若一个数的位置是(i,j),下一个数应填在(i1,j1),其中i1=i-1、j1=j-1。
(3) 若应填写的位置下标出界,则出界的值用n来代替,即若i-1=0。则取i1=n。若j-1=0,则取j=n。
(4) 若应填写的位置虽然没有出界,但是应经填有数据的话,则应填在上一个数的下面(行减1,列不变),即取i1=i-1,j1=j。
(5) 这样循环填数,直到把n*n个数全部填入方阵中,最后得到的是一个n阶魔方阵。
算法如下:
#include<stdio.h>
#include<memory.h>
int main()
{
int i,j,n,t,i1,j1,s[100][100];
while(scanf("%d",&n)!=EOF)
{
memset(s,0,sizeof(s));
i=1;
j=(n+1)/2;
t=1;
while(t<=n*n)
{
s[i][j]=t;
i1=i;
j1=j;
i--;
j--;
if(i==0)
i=n;
if(j==0)
j=n;
if(s[i][j])
{i=i1+1;j=j1;}
t++;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
printf("�",s[i][j]);
printf("\n\n");
}
}
return 0;
}