甲级1105 Spiral Matrix (25 分)

1105 Spiral Matrix (25 分)

This time your job is to fill a sequence of N positive integers into a spiral matrix in non-increasing order. A spiral matrix is filled in from the first element at the upper-left corner, then move in a clockwise spiral. The matrix has m rows and n columns, where m and n satisfy the following: m×n must be equal to N; m≥n; and m−n is the minimum of all the possible values.
Input Specification:

Each input file contains one test case. For each case, the first line gives a positive integer N. Then the next line contains N positive integers to be filled into the spiral matrix. All the numbers are no more than 10​4​​. The numbers in a line are separated by spaces.
Output Specification:

For each test case, output the resulting matrix in m lines, each contains n numbers. There must be exactly 1 space between two adjacent numbers, and no extra space at the end of each line.
Sample Input:`

12
37 76 20 98 76 42 53 95 60 81 58 93

Sample output

98 95 93
42 37 81
53 20 76
58 60 76

题意:首先给出一个数字n,然后下面给出n个数字,要求你用这些数字填满一个矩阵,这个举证的行数>=列数。沿着边界填充(顺时针走)。
思路:先对这n个数字进行排序,然后进行模拟,这个题目坑人的地方在于处理出行数和列数。

#include<bits/stdc++.h>
#pragma GCC optimize(2)
#define MAXN 405
#define maxnode 1000005
#define sigma_size 26
#define md 12345678
#define INF 0x3f3f3f3f
#define pii pair<int,int>
using namespace std;

int n;
vector<int> P;
int L,R,U,D;
int mp[MAXN][MAXN];

bool comp(int a,int b)
{
    return a>b;
}

void solve()
{
    int mm,nn;
    for(int i=1;i*i<=n;i++)
    {
        if(n%i==0)
            nn=i;
    }
    mm=n/nn;
    D=mm,R=nn;
    L=U=1;
    int i,j,cnt;
    i=j=1,cnt=0;
    while(cnt<n)
    {
        while(j<=R&&cnt<n)
            mp[U][j++]=P[cnt++];
        i++,j--,U++;
        while(i<=D&&cnt<n)
            mp[i++][R]=P[cnt++];
        j--,i--,R--;
        while(j>=L&&cnt<n)
            mp[D][j--]=P[cnt++];
        i--,j++,D--;
        while(i>=U&&cnt<n)
            mp[i--][L]=P[cnt++];
        j++,i++,L++;
    }
    for(int i=1;i<=mm;i++)
    {
        for(int j=1;j<=nn;j++)
            printf("%d%c",mp[i][j],j==nn?'\n':' ');
    }
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        int tg;
        scanf("%d",&tg);
        P.push_back(tg);
    }
    sort(P.begin(),P.end(),comp);
    solve();
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值