螺旋矩陣題解

2021-07-09 14:16:07 字數 2597 閱讀 5192

螺旋矩陣

(matrix.cpp)

【問題描述】

乙個n行n列的螺旋矩陣可由如下方法生成:

從矩陣的左上角(第1行第1列)出發,初始時向右移動;如果前方是未曾經過的格仔, 則繼續前進,否則右轉;重複上述操作直至經過矩陣中所有格仔。根據經過順序,在格仔中依次填入1, 2, 3, ... , n2,便構成了乙個螺旋矩陣。

下圖是乙個n = 4 時的螺旋矩陣。 

現給出矩陣大小n以及i和j,請你求出該矩陣中第i行第j列的數是多少。

【輸入】

輸入檔名為matrix.in。

輸入共一行,包含三個整數n,i,j,每兩個整數之間用乙個空格隔開,分別表示矩陣大小、待求的數所在的行號和列號。

【輸出】

輸出檔名為matrix.out。

輸出共一行,包含乙個整數,表示相應矩陣中第i行第j列的數。

【輸入輸出樣例】

matrix.in

matrix.out

4 2 3 14

【資料說明】

對於50%的資料,1 ≤ n ≤ 100;

對於100%的資料,1 ≤ n ≤ 30,000,1 ≤ i ≤ n,1 ≤ j ≤ n

題解

首先看到這個題目 能想到的是數字由內而外的螺旋矩陣,就可以從內圈開始逐步模擬推出各個方框的數字,最後得出結果。

這樣就可以得到規律:以左上角為座標原點,向下為y

軸正半軸,向右為x軸正半軸。

當n

為偶數時,起點在(n/2+1,(n+1)/2)處。

當n

為奇數時,起點在((n+1)/2, (n+1)/2)處。

那麼就令int x,y

為相應的數作為起點座標,旋轉規律如下:

數字遞減的方向由 右 上 左 下的順序進行旋轉,每次改變方向,該點便沿此方向平移k

次,然後再旋轉,平移k(k=1)次,然後旋轉,此時平移k+1次,以此類推,方向每改變兩次,k=k+1。

運用int dir

來儲存方向 dir/4=1,2,3,4為每次平移的方向。

建立迴圈 for(int p=n;p>=1;p--)

將矩陣列舉出來後,就可以輸出相應點的值了。

但是本題n<=30000

那麼陣列就要開9*10^8,既浪費空間也浪費時間,而且無法開出,所以這種方法在本題只適用前50%的資料。

那麼怎麼在不開陣列、盡量不計算無關點的值就得出目標值呢?

通過觀察,發現矩陣是由n/2

層構成,每層格數相差2格,對頂角上的點的值變化也有規律,如果我們找到了目標點所在的層數,就能通過較少的平移求出答案,而不是浪費資源。

至於層數的尋找,在i,j

∈n/2時是容易的,

i,j

中的最小值即為層數,層數ceng=i>j?j:i。

如果目標在其他位置,可通過對稱的方式用相同的方法求出層數。

當i>n/2

i』=1+(n-i)  j同理。

接下來可求到此層左上角的點的值:

int p=1

for(int m=1;m<=ceng;m++)

p+=4*(n-1);

運用剛才的平移法則,可求到相應的點。

再優化:

當j>x

且i=y時p(目標)=p+(j-x) ,平移判斷

當i>y

且j=x時p(目標)=p+(i-y)  ,平移 判斷

當x>j

且i=y時p(目標)=p+(x-j) ,平移  判斷

當y>i

且j=x時p(目標)=p+(y-i)  判斷

這樣就可以ac

#include#include#include#includeint main()

else

int ceng=x

螺旋矩陣 題解

螺旋矩陣 問題描述 乙個n行n列的螺旋矩陣可由如下方法生成 從矩陣的左上角 第1行第1列 出發,初始時向右移動 如果前方是未曾經過的格仔,則繼續前進,否則右轉 重複上述操作直至經過矩陣中所有格仔。根據經過順序,在格仔中依次填入1,2,3,n2,便構成了乙個螺旋矩陣。下圖是乙個n 4 時的螺旋矩陣。現...

LeetCode題解 59 螺旋矩陣 II

給定乙個正整數 n,生成乙個包含 1 到 n2 所有元素,且元素按順時針順序螺旋排列的正方形矩陣。示例 輸入 3 輸出 1,2,3 8,9,4 7,6,5 嘗試過用數學公式推導 row col 的值,沒推出來 只能用 真 螺旋 方法生成了,最外層迴圈次數是固定的,n 2次,且生成數也是從1 到 n ...

螺旋方針(螺旋矩陣)

螺旋方陣 time limit 1000ms memory limit 65536kb problem description 的螺旋方陣當n 5和n 3時分別是如下的形式 請給出乙個程式,對於任意的輸入 0 11 輸出按照上面規律所獲得的 的螺旋方陣。input 輸入第一行為整數 0 10 代表有...