1050. 螺旋矩陣(25)本題要求將給定的n個正整數按非遞增的順序,填入「螺旋矩陣」。所謂「螺旋矩陣」,是指從左上角第1個格仔開始,按順時針螺旋方向填充。要求矩陣的規模為m行n列,滿足條件:m*n等於n;m>=n;且m-n取所有可能值中的最小值。
輸入格式:
輸入在第1行中給出乙個正整數n,第2行給出n個待填充的正整數。所有數字不超過104,相鄰數字以空格分隔。
輸出格式:
輸出螺旋矩陣。每行n個數字,共m行。相鄰數字以1個空格分隔,行末不得有多餘空格。
輸入樣例:
1237
7620
9876
4253
9560
8158
93輸出樣例:
9895
9342
3781
5320
7658
6076
分析:首先需要找到最小的m,n。方法是n從1~sqrt(n)嘗試取值,如果n能被n整出,則可得m=n/n;再比較m-n與當前最小差值,若更小,則更新m,n和m-n的值。第二個輸入資料無序,需要對資料進行排序。最後構造螺旋矩陣,方法是始終朝著乙個方向往矩陣中填數,當碰到邊界時換方向繼續填數,這裡的邊界是指超出了矩陣範圍或者是在當前方向的下乙個位置已經填了數。
#include #include#include
#include
using
namespace
std;
int data[10010
];int
m,n;
bool cmp(int & a,int &b)
intmain()
//找到合適的m,n
int min_mn=10010
;
for(int i=1;i<=sqrt(n);i++)
}//申請陣列記憶體
int **arr= new
int*[m];
for(int i=0;i)
}//降序排序
sort(data,data+n,cmp);
//構造螺旋矩陣
int index=0
;
int i=0,j=0
; arr[
0][0]=data[0
]; index++;
while(indexwhile(i+1
1][j]==0
)
while(j-1>=0&&arr[i][j-1]==0
)
while(i-1>=0&&arr[i-1][j]==0
)
}//輸出結果
for(int i=0;i)
cout
<}
cout
<}
}
1050 螺旋矩陣 25
測試點2與6沒過 主要的點是 1 求得m與n,這個我是從1到一直到數的一半試的 2 構造螺旋矩陣,使用的是一圈一圈的方法,就是先把最外面的一圈填上,然後再填裡面的一圈,對於最後可能剩下的單獨一列,則是使用的列表是否為空來判斷,因為我把排好序的元素從列表中乙個個的彈出,然後放到矩陣中。未完待續。imp...
1050 螺旋矩陣 25分
本題要求將給定的 n 個正整數按非遞增的順序,填入 螺旋矩陣 所謂 螺旋矩陣 是指從左上角第 1 個格仔開始,按順時針螺旋方向填充。要求矩陣的規模為 m 行 n 列,滿足條件 m n 等於 n m n 且 m n 取所有可能值中的最小值。輸入格式 輸入在第 1 行中給出乙個正整數 n,第 2 行給出...
PAT乙 1050 螺旋矩陣 25
題目描述 本題要求將給定的n個正整數按非遞增的順序,填入 螺旋矩陣 所謂 螺旋矩陣 是指從左上角第1個格仔開始,按順時針螺旋方向填充。要求矩陣的規模為m行n列,滿足條件 m n等於n m n 且m n取所有可能值中的最小值。程式 include include include using names...