1. 程式人生 > >【NOIP2015】Day1神奇的幻方

【NOIP2015】Day1神奇的幻方

【題目描述】
幻方是一種很神奇的 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; }