c语言输出魔方阵,所谓魔方阵是指这样的方阵,她的每一行,每一列和对角线之和相

等,如 8 1 6
3 5 7
4 9 2
要求输出1~n^2的自然数构成的魔方阵

第1个回答  2012-04-27
#include<stdio.h>
#define MAX 15
int a[MAX][MAX];
int N;
void magic();
int main()
{
int i,j ;
do
{
printf("\nshuru N:");
scanf("%d",&N);
if(N%2==0||N>15)
printf("cuowu de N");
else break;
}
while(1);
magic();
printf("the is %d*%d magic",N,N);
printf("..............\n");
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
printf("%5d",a[i][j]);
printf("\n");
}
}
void magic()
{
int i,j,p,q,k;
for(i=0;i<N;i++)
for(j=0;j<N;j++)
a[i][j]=0;
a[0][(N-1)/2]=1;
k=2;
i=0;
j=(N-1)/2;
while(k<=N*N)
{
p=i-1;
q=j-1;
if(p<0) p=N-1;
if(q<0) q=N-1;
if(a[p][q]!=0)
i=i+1;
else
{
i=p;
j=q;
}
a[i][j]=k;
k++;
}
}
算法:只能输入奇数!! 3*3正确的应该如下,有规律的:
# # # #   #
# 6 1 8   #
# 7 5 3   #
# 2 9 4   #
# # # # #
1.首先把第一个数1,放在第一排正中;//估计也是要奇数的原因
2.怎样来确定下一个元素2呢?先找到1的左上方,如果超出了这个矩阵,就把他放在对应的行或列下面,没有超出就放在左上方就ok了,比如,4,5,6;
3,如果在该元素的左上方已经有元素了,就把下个元素放在自己的下面就ok了;比如3的左上方有1了,就把4放在3下面。
4,重复 上面的2,3,;就行了。
我以前写的,希望可以帮你!
第2个回答  推荐于2018-02-28
#define N 3 //N为阶数
#include <stdio.h>
int main(void)
{
int a[N][N]={0};
int i,j,n;
i=0;
j=(N-1)/2;
n=0;
while(n<N*N)
{
n++;
a[i][j]=n;
j=(j+1+N)%N;
i=(i-1+N)%N;
if(a[i][j]!=0)
{
j=(j-1+N)%N;
i=(i+2+N)%N;
}
}
printf("\n");
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
printf("%4d",a[i][j]);
printf("\n");
}
getchar();
}本回答被提问者和网友采纳
相似回答