1. 程式人生 > >PAT Basic1050 螺旋矩陣

PAT Basic1050 螺旋矩陣

連結:PAT Basic1050

本題要求將給定的 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; }