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

【noip2015】神奇的幻方

構建 == cst name long long 一行 題解 輸出 題目

題目描述

幻方是一種很神奇的 N ? N 矩陣:它由數字 1,2,3, … … , N ? N 構成,且每行、每列及兩條對角線上的數字之和都相同。

當 N 為奇數時,我們可以通過以下方法構建一個幻方: 首先將 1 寫在第一行的中間。

之後,按如下方式從小到大依次填寫每個數 K(K = 2,3, … , N ? N) :
1. 若 (K ? 1) 在第一行但不在最後一列,則將 K 填在最後一行, (K ? 1) 所在列的右一列;
2. 若 (K ? 1) 在最後一列但不在第一行,則將 K 填在第一列,(K ? 1) 所在行的上一行;
3. 若 (K ? 1) 在第一行最後一列,則將 K 填在 (K ? 1) 的正下方;
4. 若 (K ? 1) 既不在第一行,也不在最後一列,如果 (K ? 1) 的右上方還未填數, 則將 K 填在(K ? 1)的右上方,否則將 K 填在 (K ? 1) 的正下方。

現給定 N,請按上述方法構造 N ? N 的幻方。


輸入

一個整數 N,即幻方的大小。


輸出

輸出文件包含 N 行,每行 N 個整數,即按上述方法構造出的 N ? N 的幻方。相鄰兩個整數之間用單個空格隔開。


樣例輸入

3


樣例輸出

8 1 6
3 5 7
4 9 2



題解

這題真是太水了。

#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using
namespace std; #define ll long long int a[40][40],n; int main(){ cin>>n; int y=n/2+1,x=1; for(int i=1;i<=n*n;i++){ a[x][y]=i; if(x==1&&y!=n) x=n,y++; else if(x!=1&&y==n) x--,y=1; else if(x==1&&y==n) x++; else if(x!=1
&&y!=n){ if(!a[x-1][y+1]) x--,y++; else x++; } } for(int i=1;i<=n;i++){ for(int j=1;j<n;j++) cout<<a[i][j]<<" "; cout<<a[i][n]<<endl; } return 0; }

【noip2015】神奇的幻方