PAT乙級1050 螺旋矩陣 25分

2021-10-05 20:15:29 字數 1786 閱讀 7206

本題要求將給定的 n 個正整數按非遞增的順序,填入「螺旋矩陣」。所謂「螺旋矩陣」,是指從左上角第 1 個格仔開始,按順時針螺旋方向填充。要求矩陣的規模為 m 行 n 列,滿足條件:m×n 等於 n;m≥n;且 m−n 取所有可能值中的最小值。

輸入格式:

輸入在第 1 行中給出乙個正整數 n,第 2 行給出 n 個待填充的正整數。所有數字不超過 10​4,相鄰數字以空格分隔。

輸出格式:

輸出螺旋矩陣。每行 n 個數字,共 m 行。相鄰數字以 1 個空格分隔,行末不得有多餘空格。

輸入樣例:

12

3776

2098

7642

5395

6081

5893

輸出樣例:

98

9593

4237

8153

2076

5860

76

思路:自己寫的就不放了,寫的感覺冗長,還有錯誤,這跟輸出n階行列式還不一樣,得時刻避免越界等段錯誤,下邊的**是我比較喜歡的一種思路,就分享給大家,覺得挺好理解的。關鍵是你得知道m和n,才能進行後續的操作,就是數學題其實,知道兩個數的關係,然後求最值,最終轉換成乙個數的函式,求導或通過其他方式求最值即可。其他過程注釋都有了
#include

#include

#include

using

namespace std;

intmysort

(int a1,

int a2)

intmain()

//計算m,n m行n列

int m=

0,n=0;

for(i=

1;i<=

sqrt

(total)

;i++)}

//排序

sort

(arr,arr+total,mysort)

;//擺放

int bi[

10000][

100]

;int totalflag=0;

//按圈遍歷

int up=0;

int down=m-1;

int left=0;

int right=n-1;

while(1

)if(totalflag==total)

break

;//右

for(i=up+

1;i<=down;i++)if

(totalflag==total)

break

;//下

for(i=right-

1;i>=left;i--)if

(totalflag==total)

break

;//左

for(i=down-

1;i>=up+

1;i--)if

(totalflag==total)

break

;//每次都經過這樣一次判斷,可以避免段錯誤!!!

//改變邊界

up++

; down--

; left++

; right--;}

//列印

for(i=

0;i) cout << endl;

}return0;

}

PAT乙級 1050 螺旋矩陣 25分

本題要求將給定的 n 個正整數按非遞增的順序,填入 螺旋矩陣 所謂 螺旋矩陣 是指從左上角第 1 個格仔開始,按順時針螺旋方向填充。要求矩陣的規模為 m 行 n 列,滿足條件 m n 等於 n m n 且 m n 取所有可能值中的最小值。輸入在第 1 行中給出乙個正整數 n,第 2 行給出 n 個待...

PAT乙 1050 螺旋矩陣 25

題目描述 本題要求將給定的n個正整數按非遞增的順序,填入 螺旋矩陣 所謂 螺旋矩陣 是指從左上角第1個格仔開始,按順時針螺旋方向填充。要求矩陣的規模為m行n列,滿足條件 m n等於n m n 且m n取所有可能值中的最小值。程式 include include include using names...

PAT 1050 螺旋矩陣 25 分

題目傳送門 戳這 如圖所示 我們將填寫順序分解為一圈一圈 level 而每乙個level 又分為4個部分 根據n的不同,最後乙個level不一定有4個部分,但是不影響 分別對應於相同顏色的4個箭頭。1.如何求level 圈數 多畫幾個圖會發現,圈數和 短的 緊密相關,也就是和 lie 相關 不妨花點...