魔方阵是我国古代发明的一种数字游戏:n阶魔方是指这样一种方阵,他的每一列、每一行以及对角线上的的各数之和为一个相同的常数,这个常数是:n*n*n+1/2,此常数被称为魔方阵常数。由于偶次阶魔方阵(n=偶数)求解起来比较困难,这里只考虑n为奇数的情况。

一下就是一个魔方阵:

6  1  8

7  5  3

2  9  4

他的各行、各列以及对角线上的元素之和为15

问题分析:如果采用穷举法,对数据的各种分布进行判断是否满足魔方阵条件,那么当n较大时,及使用计算机也需要很长时间才能找出解来。

算法设计:有趣的是如果将1,2n*n,按某种规则填入到方阵中,得到的恰好是奇次魔方阵,这个规则可以描述如下:

(1) 首先将1填在方阵第一行的中间,即(1,(n+1/2)的位置。

(2) 下一个数填在上一个数的主对角线的上方,若一个数的位置是(ij),下一个数应填在(i1,j1,其中i1=i-1j1=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;

}

 

posted on 2011-05-04 18:13  pcoda  阅读(422)  评论(0编辑  收藏  举报