题目描述
Apple最近迷上了做幻方,Apple还是个中高手,只要你说个奇数N就能把N*N的幻方做出来。其实你可以比他做得更好的。Apple总是画得很乱,而你可以利用程序排得很整齐^_^ 幻方的要求:每一行,每一列,还有两条斜线上数字的和都相等.
输入
每行一个奇数N(0< N < 30),输入0结束
输出
输入一个奇数,输出一个幻方,顺序参照样板输出;同一列的数右对齐,数与数用一个空格分开;输出完以后加一个回车。
样例输入
5 1 0
样例输出
11 18 25 2 9 10 12 19 21 3 4 6 13 20 22 23 5 7 14 16 17 24 1 8 15 1
代码
#include<stdio.h>
#include<string.h>
int main()
{
int n,i,j;
while(1)
{
scanf("%d",&n);
if(n==1)
{
printf("1\n");
printf("\n");
continue;
}
if(n==0)
break;
int a[n][n];
memset(a,0,sizeof(a));
a[n-1][n/2]=1;//初始值固定
int t;
i=n-1;
j=n/2;
for(t=0;t<n*n-1;t++)
{
i=(i+1)%n;// 向下走一格
j=(j+1)%n;// 向右走一格
if(a[i][j]==0)//无重叠
a[i][j]=t+2;
else//有重叠
{
i=(i+n-2)%n;
j=(j+n-1)%n;//回退到原来的上面一格
a[i][j]=t+2;
}
}
int l;
if(n<10)
l=2;
else
l=3;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%*d ",l,a[i][j]);//l为占位符,根据最大的数的位数选择
}
printf("\n");
}
printf("\n");
}
return 0;
}
ps:本题主要注意格式