题目标题:
魔方矩阵(彭纪良)
题目描述:
输入一奇数n(n<20),打印出1->n*n构成的魔方矩阵。
魔方矩阵的行列及对角线的和都相等。
输入描述:
输入一奇数n(n<20)
输出描述描述:
打印出1->n*n构成的魔方矩阵,每一个数据之间用一个空格隔开,但每行的最后一个数据后不能有空格.所有输出的最后一行不能有回车
样式输入:
3
样式输出:
8 1 6
3 5 7
4 9 2
解法一:
#include<stdio.h>
main()
{
int a[20][20]={0},i,j,k,n;
scanf("%d",&n);
i=0;j=n/2;a[i][j]=1; /*j=n/2与j=(n-1)/2效果相同,因为整型数运算后取整去余*/
for(k=2;k<=n*n;k++)
{
i=i-1;j=j+1;
if(i<0) i=n-1; /*行的限制*/
if(j>n-1) j=0; /*列的限制*/
if(a[i][j]!=0) i++;/*赋值对象已被赋值的情况*/
a[i][j]=k;
}
/*魔方方阵各元素赋值,要经过三次判断以确保正确赋值*/
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%d",a[i][j]);
if(j<n-1)
printf(" ");
}
if(i<n-1)
printf("\n");
}
}
/*魔方方阵输出*/
解法二:
#include<stdio.h>
void main()
{
int a[20][20]={0},n,i,j,h,l;
scanf("%d",&n);
a[0][(n-1)/2]=1;h=0;l=(n-1)/2;
for(i=2;i<=n*n;i++) /*n的平方喔*/
{
if (h!=0 && l!=(n-1) && a[h-1][l+1]==0){a[h-1][l+1]=i;h=h-1;l=l+1;}
else if(h==0 && l!=(n-1) && a[n-1][l+1]==0){a[n-1][l+1]=i;h=n-1;l=l+1;}
else if(h!=0 && l==(n-1) && a[h-1][0]==0) {a[h-1][0]=i;h=h-1;l=0;}
else if(h==0 && l==(n-1) && a[n-1][0]==0) {a[n-1][0]=i;h=n-1;l=0;}
else{ a[h+1][l]=i;h=h+1;l=l;}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%d",a[i][j]);
if(j<n-1)
printf(" ");
}
if(i<n-1)
printf("\n");
}
}
















