PAT Basic1050 螺旋矩陣
阿新 • • 發佈:2018-12-12
本題要求將給定的 N 個正整數按非遞增的順序,填入“螺旋矩陣”。所謂“螺旋矩陣”,是指從左上角第 1 個格子開始,按順時針螺旋方向填充。要求矩陣的規模為 m 行 n 列,滿足條件:m×n 等於 N;m ≥ n;且 m−n 取所有可能值中的最小值。
輸入格式:
輸入在第 1 行中給出一個正整數 N,第 2 行給出 N 個待填充的正整數。所有數字不超過 104,相鄰數字以空格分隔。
輸出格式:
輸出螺旋矩陣。每行 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
該題方法並不難想到,我這裡採用的方法是設定 上下左右邊界(u,d,l,r),每繞完一圈,u++,d–,l++,r–,以此形成螺旋。
但是因為沒注意一些細節,WA了很多次…( WA到懷疑人生… )
首先是儲存矩陣的二維陣列,因為沒給出N的範圍,所以這裡要動態定義二維陣列。
用vector定義動態 一維陣列:
vector< int > ar ( n,value ); //對應 ar[n],value為初值(可省略)
用vector定義動態 二維陣列:
vector< vector< int > > ar (m , vector< int > (n ,value ) ); // 對應ar[m][n]
還有些要注意的點,看程式碼:
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<vector>
using namespace std;
int main()
{
int N, ar[10010];
int i, j, m, n;
scanf("%d", &N);
for (i = 0; i < N; i++) //輸入、排序
scanf("%d", &ar[i]);
sort(ar, ar + N);
for (i = 1; i <= sqrt(N); i++) //按題目要求找到 m、n
{
if (N%i == 0)
{
n = i;
m = N / i;
}
}
vector<vector<int> > output(m + 1, vector<int>(n + 1)); //動態二維陣列
int u = 1, d = m, l = 1, r = n, k = N - 1;
while (k != -1)
{
if (u==d&&l==r&&k!=-1) //注意!當u==d&&l==r,下面4個for均不會執行
output[u][l] = ar[k--];
for (i = l; i < r&&k!=-1; i++) //for的條件要有 k!=-1,不然元素用完了還在繼續填充!
output[u][i] = ar[k--];
for (i = u; i < d&&k!=-1; i++)
output[i][r] = ar[k--];
for (i = r; i > l&&k!=-1; i--)
output[d][i] = ar[k--];
for (i = d; i > u&&k!=-1; i--)
output[i][l] = ar[k--];
u++;
d--;
l++;
r--;
}
for (i = 1; i <= m; i++)
{
for (j = 1; j <= n; j++)
{
if (j != 1)
printf(" ");
printf("%d", output[i][j]);
}
printf("\n");
}
return 0;
}