奇數階魔方 1998

2021-10-22 07:29:04 字數 1779 閱讀 9503

problem description

乙個 n 階方陣的元素是1,2,…,n^2,它的每行,每列和2條對角線上元素的和相等,這樣

的方陣叫魔方。n為奇數時我們有1種構造方法,叫做「右上方」 ,例如下面給出n=3,5,7時

的魔方.

38 1 6

3 5 7

4 9 2

517 24 1 8 15

23 5 7 14 16

4 6 13 20 22

10 12 19 21 3

11 18 25 2 9

730 39 48 1 10 19 28

38 47 7 9 18 27 29

46 6 8 17 26 35 37

5 14 16 25 34 36 45

13 15 24 33 42 44 4

21 23 32 41 43 3 12

22 31 40 49 2 11 20

第1行中間的數總是1,最後1行中間的數是n^2,他的右邊是2,從這三個魔方,你可看出「右

上方」是何意。

input

包含多組資料,首先輸入t,表示有t組資料.每組資料1行給出n(3<=n<=19)是奇數。

output

對於每組資料,輸出n階魔方,每個數占4格,右對齊

sample input

235

sample output

8 1 6

3 5 7

4 9 2

17 24 1 8 15

23 5 7 14 16

4 6 13 20 22

10 12 19 21 3

11 18 25 2 9

題目解析

從文中"右上方"我們就可以獲取關鍵資訊

當我們順著 45° 角的關係 觀察數與數之間的聯絡,可以看到大部分數是 連在一起的數,我們順著這個"線索"往下,可以發現有些特殊的 數 它並不符合我們前面看到關係,那麼我們可以找一下關於這些數的規律並將它們整理歸類 大致整理一下有下面幾種情況:

1.45°看,可以連著的數

2.繼續45°觀察時,即將出界的數(出界分為,左出界,上出界,左上出界)

3.繼續45°觀察,被其他數阻擋連線的情況

分別考慮這些情況

可能講的有些模糊,請包涵!

**如下:

#include

#include

#include

using

namespace std;

intmain()

else

if(i-

1<

0&&j+

1else

if(i-

1>=

0&&j+

1==m)

else

if(i-

1>=

0&&j+

1else}}

for(

int p=

0;preturn0;

}

hdu 1998 奇數階魔方

hdu 1998 奇數階魔方 題意 給出奇數n,用右上法構造乙個n階魔方 思路 由題目給出的示例中可以知道,右上法構造方法如下 從第一行的中間數開始為1,然後這個位置的上一行右邊為這個數 1,如果新位置已被使用,則新位置改為舊位置的正下方 author licatweijie include inc...

HDU 1998 奇數階魔方

problem description 乙個 n 階方陣的元素是1,2,n 2,它的每行,每列和2條對角線上元素的和相等,這樣 的方陣叫魔方。n為奇數時我們有1種構造方法,叫做 右上方 例如下面給出n 3,5,7時 的魔方.3 8 1 6 3 5 7 4 9 2 5 17 24 1 8 15 23 ...

奇數階魔方 HDU 1998

乙個 n 階方陣的元素是1,2,n 2,它的每行,每列和2條對角線上元素的和相等,這樣 的方陣叫魔方。n為奇數時我們有1種構造方法,叫做 右上方 例如下面給出n 3,5,7時 的魔方.3 8 1 6 3 5 7 4 9 2 5 17 24 1 8 15 23 5 7 14 16 4 6 13 20 ...