NYOJ 734 奇數階魔方

2021-06-14 19:25:41 字數 1462 閱讀 7955

時間限制:

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

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

#include#includeint main()

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

奇數階魔方

時間限制 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 ...