本題要求將給定的 n 個正整數按非遞增的順序,填入「螺旋矩陣」。所謂「螺旋矩陣」,是指從左上角第 1 個格仔開始,按順時針螺旋方向填充。要求矩陣的規模為 m 行 n 列,滿足條件:m×n 等於 n;m≥n;且 m−n 取所有可能值中的最小值。
輸入格式:
輸入在第 1 行中給出乙個正整數 n,第 2 行給出 n 個待填充的正整數。所有數字不超過 104,相鄰數字以空格分隔。
輸出格式:
輸出螺旋矩陣。每行 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 相關 不妨花點...