PAT【甲级】1105

题目链接:PAT【甲级】1105
题目简述:将给定的N个正整数按非递增的顺序,填入“螺旋矩阵”。所谓“螺旋矩阵”,是指从左上角第1 个格子开始,按顺时针螺旋方向填充,要求矩阵的规模为m行n列,满足条件:m*n=Nm>=n;且 m-n取所有可能值中的小值。

#include<bits/stdc++.h>
using namespace std;

int main(){
    int N, m, n, u = 0;
    cin >> N;
    vector<int> v(N);
    for (n = sqrt(N); n >= 2;n--)
        if(N % n==0)
            break;
    m = N / n;
    vector<vector<int>> ans(m,vector<int>(n));
    for (int i = 0; i < N;i++)
        cin >> v[i];
    sort(v.rbegin(), v.rend());
    int l = 0, r = n - 1, t = 0, b = m - 1;
    while(l <= r && t <= b){
        for (int i = l; i <= r;i++)//右填充
            ans[t][i] = v[u++];
        for (int i = t + 1; i <= b;i++)//下填充
            ans[i][r] = v[u++];
        if(b > t){//注意条件,规避掉重复的可能
            for (int i = r - 1; i >= l;i--)//左填充
                ans[b][i] = v[u++];
        }
        if(r > l){//同上
            for (int i = b - 1; i > t;i--)//上填充
                ans[i][l] = v[u++];
        }
        l++;
        t++;
        b--;
        r--;
    }
    for (int i = 0; i < m;i++){
        cout << ans[i][0];
        for (int j = 1; j < n;j++)
            cout << " " << ans[i][j];
        cout << endl;
    }
    return 0;
}

这个题和对于矩阵螺旋输出值的题目几乎是一模一样的,无非是两个相反的过程。但螺旋的框架过程还是一样的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值