【NOIP2015】Day1神奇的幻方
阿新 • • 發佈:2019-02-14
【題目描述】
幻方是一種很神奇的 N*N 矩陣:它由數字 1,2,3, ,N×N 構成,且每行、每列及兩條對角線上的數字之和都相同。
當N 為奇數時,我們可以通過下方法構建一個幻方:
首先將 1 寫在第一行的中間。
之後,按如下方式從小到大依次填寫每個數 K(K=2,3,⋯,N×N) :
若 (K-1) 在第一行但不在最後一列,則將 K 填在最後一行, (K-1)所在列的右一列;
若 (K-1)在最後一列但不在第一行,則將 K填在第一列, (K-1) 所在行的上一行;
若 (K-1) 在第一行最後一列,則將 KK 填在 (K-1)的正下方;
若 (K-1) 既不在第一行,也最後一列,如果 (K-1)的右上方還未填數,則將 KK 填在 (K-1) 的右上方,否則將 LL 填在 (K-1)的正下方。
現給定 N ,請按上述方法構造N×N 的幻方。
【輸入格式】:
一個正整數 N,即幻方的大小。
【輸出格式】:
共 N 行 ,每行 N個整數,即按上述方法構造出的 N×N 的幻方,相鄰兩個整數之間用單空格隔開。
【輸出樣例】
3
【輸出樣例】
8 1 6
3 5 7
4 9 2
【說明】
N≤39且N為奇數
【分析】
。。。
純模擬不解釋,
水水的100分
下方貼程式碼:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std ;
int n;
int s[51][51];
int lx,ly;
int main()
{
freopen("magic.in","r",stdin);
freopen("magic.out","w",stdout);
memset(s,0,sizeof(s));
scanf("%d",&n);
lx=1,ly=(n>>1)+1;
s[lx][ly]=1;
int k=n*n;
for(int i=2;i<=k;i++)
{
if(lx==1&&ly!=n)
lx=n,ly++;
else if(lx!=1&&ly==n)
lx--,ly=1;
else if(lx==1&&ly==n)
lx++;
else if(lx!=1&&ly!=n)
{
if(s[lx-1][ly+1]==0)lx--,ly++;
else lx++;
}
s[lx][ly]=i;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<n;j++)
printf("%d ",s[i][j]);
printf("%d\n",s[i][n]);
}
return 0;
}