PAT甲级——1105 Spiral Matrix——分数 25

题目


螺旋填充数组


解法1

点击查看代码
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;

int main(){
    int N; cin >> N;
    
    vector<int> vi(N);
    for(int i = 0; i < N; i++) cin >> vi[i];
    
    // 排序要降序排列
    sort(vi.begin(), vi.end(), greater<int>());
    
    // 找m和n,使得m*n=N,且m>=n且m最小
    int m = N, n = 1;
    for(int i = 1; i*i <= N; i++){
        if(N % i == 0){
            m = N / i;
        }
    }
    n = N / m;
        
    vector<vector<int>> ans(m, vector<int>(n, 0));

    int top = 0, bottom = m-1, left = 0, right = n-1;
    int idx = 0;
    while(idx < N){
        for(int i = left; i <= right && idx < N; i++) ans[top][i] = vi[idx++];
        top++;
        for(int i = top; i <= bottom && idx < N; i++) ans[i][right] = vi[idx++];
        right--;
        for(int i = right; i >= left && idx < N; i--) ans[bottom][i] = vi[idx++];
        bottom--;
        for(int i = bottom; i >= top && idx < N; i--) ans[i][left] = vi[idx++];
        left++;
    }

    // 输出
    for(int i = 0; i < m; i++){
        for(int j = 0; j < n; j++){
            printf((j>0)?" %d":"%d",ans[i][j]);
            // if(j > 0) cout << " ";
            // cout << ans[i][j];
        }
        cout << endl;
    }

    return 0;
}

posted on 2025-04-27 10:55  LEESOL-cn  阅读(6)  评论(0)    收藏  举报

导航