1. 程式人生 > >【算法筆記】B1050 螺旋矩陣

【算法筆記】B1050 螺旋矩陣

bin str ace 輸入 個數字 b- 格子 輸出格式 --

1050 螺旋矩陣 (25 分)

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

輸入格式:

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

輸出格式:

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

輸入樣例:

12
37 76 20 98 76 42 53 95 60 81 58 93

輸出樣例:

98 95 93
42 37 81
53 20 76
58 60 76

【碰壁法】判斷下一個數,如果不為0就拐彎。最後一個測試點總是超時,把 col = (int)sqrt(n) 改成 col = sqrt(n) 後 AC。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn = 10010;
 4 int a[maxn][maxn] = {0};
 5 bool
cmp(int a, int b){ 6 return a > b; 7 } 8 int main(){ 9 int n, ori[maxn]; 10 cin>>n; 11 int col = sqrt(n), row; 12 while(n % col){ 13 col--; 14 } 15 row = n / col; 16 for(int i = 0; i < n; i++){ 17 scanf("%d",&ori[i]); 18 }
19 sort(ori, ori + n, cmp); 20 int x = 1, y = 1, cnt = 0; 21 a[y][x] = ori[cnt]; 22 while(cnt + 1 < n){ 23 while(y + 1 <= col && ! a[x][y + 1]) 24 a[x][++y] = ori[++cnt]; 25 while(x + 1 <= row && !a[x + 1][y]) 26 a[++x][y] = ori[++cnt]; 27 while(y - 1 > 0 && !a[x][y - 1]) 28 a[x][--y] = ori[++cnt]; 29 while(x - 1 > 0 && !a[x - 1][y]) 30 a[--x][y] = ori[++cnt]; 31 } 32 for(int i=1;i<=row;i++){ 33 printf("%d",a[i][1]); 34 for(int j=2;j<=col;j++){ 35 printf(" %d",a[i][j]); 36 } 37 printf("\n"); 38 } 39 return 0; 40 }

【算法筆記】B1050 螺旋矩陣