【noip2015】神奇的幻方
阿新 • • 發佈:2018-08-20
構建 == 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> usingnamespace 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】神奇的幻方