PAT(Advanced)甲級1105 Spiral Matrix C++實現
題目鏈接
題目大意
給定N個元素的序列,輸出其m * n
螺旋矩陣,螺旋矩陣從左上角開始遞減地順時針螺旋,要求m * n
等於N
,且n <= m
,且m - n
在所有m - n
的可能值中最小
算法思路
根據題意,將給定序列排序,在設置m*n
二維數組spiralMatrix
存放序列對應鞋標,順時針遍歷逆時針遍歷即可
AC代碼
/*
author : eclipse
email : [email protected]
time : Mon Jun 29 16:32:53 2020
*/
#include <bits/stdc++.h>
using namespace std;
#define RIGHT 0
#define LEFT 1
#define UP 2
#define DOWN 3
const int MAX = 10e5 + 10;
vector<vector<int> > spiralMatrix;
vector<int> sequence;
int m, n;
void spiralDescent() {
int currentX = 0, currentY = 0;
int direction = RIGHT;
for (int i = 0; i < sequence.size(); i++) {
spiralMatrix[currentX][currentY] = i;
if (direction == RIGHT) {
if (currentY + 1 >= n || spiralMatrix[currentX][currentY + 1] != -1) {
currentX++;
direction = DOWN;
} else {
currentY++;
}
} else if (direction == LEFT) {
if (currentY - 1 < 0 || spiralMatrix[currentX][currentY - 1] != -1) {
currentX--;
direction = UP;
} else {
currentY--;
}
} else if (direction == UP) {
if (currentX - 1 < 0 || spiralMatrix[currentX - 1][currentY] != -1) {
currentY++;
direction = RIGHT;
} else {
currentX--;
}
} else {
if (currentX + 1 >= m || spiralMatrix[currentX + 1][currentY] != -1) {
currentY--;
direction = LEFT;
} else {
currentX++;
}
}
}
}
int main(int argc, char const *argv[]) {
int N;
scanf("%d", &N);
sequence.resize(N);
for (int i = 0; i < sequence.size(); i++) {
scanf("%d", &sequence[i]);
}
int minimum = MAX;
for (int i = 1; i * i <= N; i++) {
if (N % i == 0) {
if (N / i - i < minimum) {
n = i;
m = N / n;
minimum = m - n;
}
}
}
spiralMatrix.resize(m);
for (int i = 0; i < m; i++) {
spiralMatrix[i].resize(n);
for (int j = 0; j < spiralMatrix[i].size(); j++) {
spiralMatrix[i][j] = -1;
}
}
sort(sequence.begin(), sequence.end(), [=](int x, int y)->bool { return x > y; });
spiralDescent();
for (int i = 0; i < spiralMatrix.size(); i++) {
printf("%d", sequence[spiralMatrix[i][0]]);
for (int j = 1; j < spiralMatrix[i].size(); j++) {
printf(" %d", sequence[spiralMatrix[i][j]]);
}
printf("\n");
}
return 0;
}
樣例輸入
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
鳴謝
最後
- 由於博主水平有限,不免有疏漏之處,歡迎讀者隨時批評指正,以免造成不必要的誤解!