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 104. 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;
}