奇數階魔方

2021-07-11 18:24:47 字數 1601 閱讀 6292

時間限制:

1000 ms  |  記憶體限制:

65535 kb

難度:3 描述

乙個 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,從這三個魔方,你可看出「右

上方」是何意。 

輸入

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

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

樣例輸入

2

35

樣例輸出

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

規律:從第一行中間乙個數開始更新,如果是當前位置在第一行(但不是最後一列),下乙個位置是 下一列最後一行;如果當前位置是最後一列(但不是第一行),下乙個位置是 上一行第一列;如果不是最後一列並且右上角的值沒有更新,下乙個位置就是右上角;如果右上角的值已經更新,下乙個位置是下一行同一列位置;如果當前位置在最右上角,下乙個位置是同列下一行位置;

[cpp]view plain

copy

#include

#include

intmain()  

else

if(j==n&&i!=1) 

/*最後一列但不是第一行*/

else

if(j!=n&&!vis[i-1][j+1]) 

/*更新右上角的值*/

else

if(i!=n&&j!=n&&vis[i-1][j+1]) 

/*右上角已更新*/

i=i+1;  /*跳到同列下一行*/

else

if(i==1&&j==n) 

/*最右上角*/

i=i+1; /*跳到同列下一行*/

ans++;  

}  for

(i=1;i<=n;i++)  

}  return

0;  

}  

奇數階魔方

時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 乙個 n 階方陣的元素是1,2,n 2,它的每行,每列和2條對角線上元素的和相等,這樣 的方陣叫魔方。n為奇數時我們有1種構造方法,叫做 右上方 例如下面給出n 3,5,7時 的魔方.38 1 6 3 5 7 4 9 2 517...

奇數階魔方 1998

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 ...

奇數階魔方陣(洛書)

題目 將1 n的數子排列在n n的方陣上,要求數子不能重複,方陣各行 各列 及兩條對角線的數子之和相等。此位魔方陣,又稱洛書 洛書是九行九列 若n為奇數,則為奇數階魔方陣。解題方法 洛書的排列規律如下 將1放在第一行中間一列 從2開始直到n n止各數依次按下列規則存放 每乙個數存放的行比前乙個數的行...