PAT(Advanced)1105 Spiral Matrix C++實現

PAT(Advanced)甲級1105 Spiral Matrix C++實現

題目鏈接

1105 Spiral Matrix

題目大意

給定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

鳴謝

PAT

最後

  • 由於博主水平有限,不免有疏漏之處,歡迎讀者隨時批評指正,以免造成不必要的誤解!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章