PAT A 1105 Spiral Matrix (25分)

一、题目概述

要求:
1、据给定N, 找到m、n使得m * n = N, 且m-n的值最接近0;
2、使用N个元素构造m x n的螺旋矩阵, 元素降序。

二、思路

1、m、n的选择:n取不大于根号N,且能被N整除的最大值, m = N / n。

    for( n = sqrt(N); N % n; --n );
    m = N / n;

2、矩阵的构造:width、height控制高度和宽度, l为步长,flag控制方向。
在这里插入图片描述

    for(int i = 0, j = -1, k = 0, w = n, h = m; k < N;)
    {
        for(int l = 0; l < w && k < N; ++l)
            ans[i][++j] = a[k++];
        --h;
        for(int l = 0; l < h && k < N; ++l)
            ans[++i][j] = a[k++];
        --w;
        for(int l = 0; l < w && k < N; ++l)
            ans[i][--j] = a[k++];
        --h;
        for(int l = 0; l < h && k < N; ++l)
            ans[--i][j] = a[k++];
        --w;
    }

三、代码

#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
int main()
{
    int N, m, n;
    scanf("%d", &N);
    n = (int)sqrt((double)N);
    while(N % n)
        --n;
    m = N / n;
    int a[N], ans[m][n] = {0};
    for(int i = 0; i < N; ++i)
        scanf("%d", &a[i]);
    sort(a, a + N, [](int a, int b){return a > b;});
    for(int i = 0, j = -1, k = 0, w = n, h = m; k < N;)
    {
        for(int l = 0; l < w && k < N; ++l)
            ans[i][++j] = a[k++];
        --h;
        for(int l = 0; l < h && k < N; ++l)
            ans[++i][j] = a[k++];
        --w;
        for(int l = 0; l < w && k < N; ++l)
            ans[i][--j] = a[k++];
        --h;
        for(int l = 0; l < h && k < N; ++l)
            ans[--i][j] = a[k++];
        --w;
    }
    for(int i = 0; i < m; ++i)
        for(int j = 0; j < n; ++j)
            printf("%d%s", ans[i][j], j + 1 == n ? "\n":" ");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值