1080: 做幻方
时间限制: 1 Sec 内存限制: 128 MB提交: 5 解决: 1
[ 提交][ 状态][ 讨论版]
题目描述
Apple最近迷上了做幻方,Apple还是个中高手,只要你说个奇数N就能把N*N的幻方做出来。其实你可以比他做得更好的。Apple总是画得很乱,而你可以利用程序排得很整齐^_^ 幻方的要求:每一行,每一列,还有两条斜线上数字的和都相等.
输入
每行一个奇数N(0< N < 30),输入0结束
输出
输入一个奇数,输出一个幻方,顺序参照样板输出;同一列的数右对齐,数与数用一个空格分开;输出完以后加一个回车。
样例输入
510
样例输出
11 18 25 2 910 12 19 21 3 4 6 13 20 2223 5 7 14 1617 24 1 8 151
提示
来源
ac代码
#include<stdio.h>
#include<string.h>
int map[35][35],v[35][35],n;
void print1()
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(j)
printf(" %d",map[i][j]);
else
printf("%d",map[i][j]);
}
printf("\n");
}
}
void print2()
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(j)
printf(" %2d",map[i][j]);
else
printf("%2d",map[i][j]);
}
printf("\n");
}
}
void print3()
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(j)
printf(" %3d",map[i][j]);
else
printf("%3d",map[i][j]);
}
printf("\n");
}
}
int main()
{
//int n;
while(scanf("%d",&n)!=EOF,n)
{
int j=n/2,i=n-1,cot=1,m=n*n;
memset(v,0,sizeof(v));
while(cot<=m)
{
if(v[i][j]||(i>=n&&j>=n))
{
i-=2;
j--;
}
else
if(i>=n)
{
i=0;
}
else
if(j>=n)
{
j=0;
}
map[i][j]=cot++;
v[i][j]=1;
i++;
j++;
}
if(n<=3)
{
print1();
}
else
if(n<=9)
print2();
else
print3();
printf("\n");
}
}