c语言中魔方阵编程的思路

如题所述

/*
所谓魔方阵是指这样的的方阵:
它的每一行、每一列和对角线之和均相等。
输入n,要求打印由自然数1到n2的自然数构成的魔方阵(n为奇数)。
例如,当n=3时,魔方阵为:
 8 1 6
 3 5 7
 4 9 2
魔方阵中各数排列规律为:
① 将“1”放在第一行的中间一列;
② 从“2”开始直到n×n为止的各数依次按下列规则存放:每一个数存放的行比前一个数的行数减1,列数同样加1;
③ 如果上一数的行数为1,则下一个数的行数为n(最下一行),如在3×3 方阵中,1在第1行,则2应放在第3行第3列。
④ 当上一个数的列数为n时,下一个数的列数应为1,行数减1。如2在第3行第3列,3应在第2行第1列。

⑤如果按上面规则确定的位置上已有数,或上一个数是第1行第n列时,则把下一个数放在上一个数的下面。

如按上面的规定,4应放在第1行第2列,但该位置已被1占据,所以4就放在3的下面。由于6是第1行第3列(即最后一列),故7放在6下面。
*/

#include"stdio.h"

void main()
{
int i,n=5;
printf("---------------打印魔方阵-------------\n\n");
int a[5][5];
for( i=0;i<n;i++)
for(int j=0;j<n;j++)
a[i][j]=0;//初始化

i=0;
int j=n/2;
int t=1;
int si=0;
int sj=0;//记录上一个数的位置

while(t<=n*n)
{
//printf("\n%4d\n\n",t);
if(a[i][j]==0)
a[i][j]=t;

else
{
if(si==0 && sj==n-1)
{
a[si+1][sj]=t;
i=si+1;
j=sj;
}
if(si!=n-1)
{
a[si+1][sj]=t;
i=si+1;
j=sj;
}

if(si==n-1)
{
a[0][sj]=t;
i=0;
j=sj;
}
}

si=i;
sj=j;

/*计算下一个元素的位置*/
if(i==0)
i=n-1;
else
i=i-1;

if(j==n-1)
j=0;
else
j=j+1;

t=t+1;
}

for(i=0;i<n;i++)
{
for(int j=0;j<n;j++)
printf("%4d",a[i][j]);
printf("\n\n");
}

}
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2016-01-29
/**************打印生成七阶魔方*************/
#include
#include
#define N 7 //可以改变这里的值,但只能是奇数,偶数与这个算法不同
void main ( )
{
int m[N][N]={0}; /*全部元素初始化为0*/
int i,j,k;
i=0;j=N/2; /*初始位置*/
for (k=1;k<=N*N;k++)
{
m[i][j]=k;
if (i-1<0&&j-1<0) /*既超上界又超左界*/
++i;
else
if (i-1<0) /*只超上界*/
{i=N-1;--j;}
else
if (j-1<0) /*只超左界*/
{--i;j=N-1;}
else /*不超界*/
if (m[i-1][j-1]) /*不为0了,即已填过了*/
++i;
else
{--i;--j;} /*一般情况*/
}
for (i=0;i{
for (j=0;jprintf ("%7d",m[i][j]);

printf ("\n");

}
getch( );
}本回答被提问者采纳

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网