PTA 螺旋矩阵

给定一个包含 N 个正整数的序列,请你将序列中的元素以非递增顺序填充到螺旋矩阵中。

从左上角的第一个元素开始填充,并按照顺时针方向旋转。

要求矩阵有 m 行 n 列,并且 m,n 满足:

m×n=N,
m≥n,
m−n 尽可能小

输入格式:

第一行包含整数 N,1≤N≤10000。

第二行包含 N 个整数,1≤ 序列中元素 ≤10000。

输出格式:

输出填充好的 m×n 的矩阵。

数字之间用一个空格隔开,结尾不得有多余空格。

输入样例:

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
#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
const ll N = 2e5 + 10;
ll n, m, num, f, len, T, k;
ll x[N];
ll a[1010][1010];
ll dir[4][2] = {0, 1, 1, 0, 0, -1, -1, 0};

void dfs(ll tx, ll ty, ll idx, ll fx) {//idx 下标  fx 方向(0,1,2,3,四个方向)
    if (idx > n * m)return;
    a[tx][ty] = x[idx];
    ll xx = tx + dir[fx][0];
    ll yy = ty + dir[fx][1];
    if (xx >= 1 && xx <= n && yy >= 1 && yy <= m && a[xx][yy] == 0) {// 判断越界
        dfs(xx, yy, idx + 1, fx % 4);
        return;
    }
    xx = tx + dir[(fx + 1) % 4][0];
    yy = ty + dir[(fx + 1) % 4][1];
    dfs(xx, yy, idx + 1, (fx + 1) % 4);//如果越界就换方向
}


int main() {
    cin >> n;
    for (ll i = 1; i <= n; i++)cin >> x[i];
    sort(x + 1, x + n + 1, greater<ll>());
    for (ll i = sqrt(n); i >= 1; i--) {  //计算边长
        if (n % i == 0) {
            m = i;
            n /= i;
            break;
        }
    }
    dfs(1, 1, 1, 0);
    for (ll i = 1; i <= n; i++) {
        for (ll j = 1; j <= m; j++) {
            if (j != 1)cout << " ";
            cout << a[i][j];
        }
        cout << endl;
    }
}

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值