魔方阵 谭浩强
# include <stdio.h>
void main()
{int a[16][16],i,j,k,p,n;
p=1;
while(p==1)
{printf("enter n(n=1 to 15):");
scanf("%d",&n);
if ((n!=0)&&(n<=15)&&(n%2!=0))
p=0;
}
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
a[i][j]=0;
i=1;
j=n/2+1;
a[i][j]=1;
for (k=2;k<=n*n;k++)
{i=i-1;j=j+1;
if ((i<1)&&(j>n))
{i=i+2;j=j-1;/*这里是什么意思?*/
}
else
{if ( i<1 ) i=n;
if ( j>n ) j=1;
}
if (a[i][j]==0)
a[i][j]=k;
else
{i=i+2;j=j-1;
a[i][j]=k;
}
}/*这里i=i+2;j=j-1;
a[i][j]=k; 为什么里要还要i=i+2?j=j-1? */
for(i=1;i<=n;i++)
{ for (j=1;j<=n;j++)
printf("%5d",a[i][j]);
printf("\n\n");
}
return 0;
}
[解决办法]
魔方阵中各数的排列规律如下:
1.将1放在第一行中间一列;
2.从2开始直到N*N止各数依次按下列规则存放:每一个数存放的行比前一个数的行数
减1,列数加1(例如上面的三阶魔方阵,5 在 4 的上一行后一列);
3.如果上一数的行数为1,则下一个数和行数为N(指最下一行).例如1在第一行,则2应放在
最下一行,列数同样加1;
4.当上一个数的列数为N时,下一个数的列数应为1,行数减1.例如2在第三行最后一列则3
应放在第二行第一列;
5.如果按上面的规则确定的位置上已有数,或上一个数是第1行第N列时,则把下一个数放 在 上一个数的下面.例如按上面的确定,4应该放在第一行第二列,但该位置已被1占据所以
4就放在3 的下面.
按此方法可以得到任何阶的魔方阵.
#include<stdio.h>
void main()
{
int a[16][16],i,j,k,p,n;
p=1;
//奇数
while(p==1)
{
printf("Enter n(n=1~15):");
scanf("%d",&n);
if((n!=0)&&(n<=15)&&(n%2!=0))
p=0;
}
//初始化
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
a[i][j]=0;//建立魔方
j=n/2+1;
a[1][j]=1;//将1放在第一行第一列
//摆放位置的设置
for(k=2;k<=n*n;k++)
{
i=i-1;
j=j+1;
if((i<1)&&(i>n))
{
i=i+2;
j=j-1;
}
else
{
if(i<1)i=n;
if(j>n)j=1;
}
if(a[i][j]==0)
a[i][j]=k;
else
{
i=i+2;
j=j-1;
a[i][j]=k;
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
printf("%4d",a[i][j]);
printf("\n");
}
}参考