神奇的幻方
学长说要把博客当错题本,好吧,今天确实考试了,QAQ…
考的NOIP2015Day1的题,还比较简单,模拟就可以满分。对他们一定是拼手速的题吧。。。
自己写的代码片如下:
#include<iostream>
#include<cstdio>
using namespace std;
int N,k;
int a[100][100];
int b[3000][3];
int main()
{
freopen("magic.in","r",stdin);
freopen("magic.out","w",stdout);
k=1;
scanf("%d",&N);
if(N==1) printf("1");
else{
a[1][N/2+1]=k;
++k;
b[1][1]=1;b[1][2]=N/2+1;
while(k<=N*N)
{
if(b[k-1][1]==1&&b[k-1][2]!=N)
{
a[N][b[k-1][2]+1]=k;
b[k][1]=N;
b[k][2]=b[k-1][2]+1;
++k;
}
else if(b[k-1][1]!=1&&b[k-1][2]==N)
{
a[b[k-1][1]-1][1]=k;
b[k][1]=b[k-1][1]-1;
b[k][2]=1;
++k;
}
else if(b[k-1][1]==1&&b[k-1][2]==N)
{
a[b[k-1][1]+1][b[k-1][2]]=k;
b[k][1]=b[k-1][1]+1;
b[k][2]=b[k-1][2];
++k;
}
else if(b[k-1][1]!=1&&b[k-1][2]!=N)
{
if(a[b[k-1][1]-1][b[k-1][2]+1]==0)
{
a[b[k-1][1]-1][b[k-1][2]+1]=k;
b[k][1]=b[k-1][1]-1;
b[k][2]=b[k-1][2]+1;
++k;
}
else
{
a[b[k-1][1]+1][b[k-1][2]]=k;
b[k][1]=b[k-1][1]+1;
b[k][2]=b[k-1][2];
++k;
}
}
}
for(int i=1;i<=N;++i)
{
for(int j=1;j<=N;++j)
printf("%d ",a[i][j]);
printf("\n");
}
}
fclose(stdin);
fclose(stdout);
return 0;
}