1. 程式人生 > 實用技巧 >神奇的幻方

神奇的幻方

題目描述

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

N 為奇數時,我們可以通過下方法構建一個幻方:

首先將 1寫在第一行的中間。

之後,按如下方式從小到大依次填寫每個數 K(K=2,3,⋯ ,N×N)

  1. (K−1)在第一行但不在最後一列,則將 K 填在最後一行(K1) 所在列的右一列;
  2. (K1) 在最後一列但不在第一行,則將 K 填在第一列, (K1) 所在行的上一行;
  3. (K−1) 在第一行最後一列,則將 K填在 (K1) 的正下方;
  4. (K−1) 既不在第一行,也不在最後一列,如果 (K1) 的右上方還未填數,則將 K 填在 (K1) 的右上方,否則將 K 填在 (K1) 的正下方。

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

輸入格式

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

輸出格式

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

輸入輸出樣例

輸入 #1
3
輸出 #1
8 1 6
3 5 7
4 9 2

程式碼如下

#include<iostream>
using namespace std;

int cube[40][40];
int main()
{
int N;
int i,j;
int k = 1;

cin >> N;
i = 1;
j = N/2 + 1;

while(k <= N*N)
{
cube[i][j] = k;
if(k % N == 0)
++i;
else
{
--i;
++j;
}
if(i == 0)
i = N;

if(j == N+1)
j = 1;

k++;
}

for(int i = 1; i <= N; i++)
{
for(int j = 1; j <= N; j++)
cout << cube[i][j] << " ";
cout << endl;
}
return 0;
}