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
题目大意:
代码:
#include<stdio.h>
#include<algorithm>
#include<math.h>
using namespace std;
bool cmp(int a,int b)
{
return a>b;
}
int a[100000];
int b[10000][10000];
int main()
{
int n,m,k,t=0;
scanf("%d",&n);
k= sqrt((double)n);
while(k>1) {
if(n % k == 0)
break;
k--;
}
m=n/k;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
sort(a,a+n,cmp);
for (int i=0;t<n;i++) {
for (int j=i;j<k-i&&t<n;j++)
b[i][j]=a[t++];
for (int j=i+1;j<m-1-i&&t<n;j++)
b[j][k-1-i]=a[t++];
for (int j=k-i-1;j>=i &&t<n;j--)
b[m-1-i][j]=a[t++];
for (int j=m-2-i;j>=i+1&&t<n;j--)
b[j][i]=a[t++];
}
for(int i=0;i<m;i++)
{
for(int j=0;j<k;j++)
{
if(j==0)
{
printf("%d",b[i][j]);
}
else
{
printf(" %d",b[i][j]);
}
}
printf("\n");
}
}
还没有评论,来说两句吧...