# 1050. Spiral Matrix (25) PAT Class B True Theme

Posted by iamcaper on Mon, 06 Jul 2020 17:11:40 +0200

1050. Spiral Matrix (25)

This question requires that the given N positive integers be filled in a "spiral matrix" in a non-increasing order.The so-called "spiral matrix" refers to filling in a clockwise spiral direction starting from the first grid in the upper left corner.The size of the matrix is required to be m rows and N columns, satisfying the following conditions: m*n equals N; m>=n; and m-n takes the minimum of all possible values.

Input format:

The input gives a positive integer N in line 1 and N in line 2 to be filled.All numbers do not exceed 104, and adjacent numbers are separated by spaces.

Output format:

Output spiral matrix.n numbers per line, m rows in total.Adjacent numbers are separated by a space and no extra space is allowed at the end of the line.

Input sample:
```12
37 76 20 98 76 42 53 95 60 81 58 93
```
Output sample:
```98 95 93
42 37 81
53 20 76
58 60 76
```
This question is sorted first by a simple order, followed by a matrix according to the meaning of the title.I don't have any good suggestions here, just slowly debug. I really debugged many times based on the output the first time I did it.At that time, the computer still had some problems 1000*1000 matrix can not be defined, only use 10*10 first, and finally debug it before changing the data in hand, a bitter tear.This is my code:
```#include<stdio.h>
#include<math.h>

int main(void)
{
int N,m,n;
static int a[10000];
static int b[10000][10000];
int i,j,max,s=0;
scanf("%d",&N);
n=sqrt(N);
while(N%n!=0)
{
n--;
}
if (N/n>n) m=N/n;
else
{
n=N/n;m=N/n;
}
for (i=0;i<N;i++)
{
scanf("%d",&a[i]);
}
for (i=0;i<N;i++)                                           //Sort from large to small
{
max=i;
for (j=i+1;j<N;j++)
{
if (a[j]>a[max]) max=j;
}
j=a[i];a[i]=a[max];a[max]=j;
}
i=0;j=0;
do
{
do
{
b[i][j]=a[s];
s++;j++;
}while(j<n && b[i][j]==0);
j--;s--;
do
{
b[i][j]=a[s];
s++;i++;
}while(i<m && b[i][j]==0);
i--;s--;
do
{
b[i][j]=a[s];
s++;
}while(b[i][--j]==0 && j>=0);
j++;s--;
do
{
b[i][j]=a[s];
s++;
}while(b[--i][j]==0 && i>=0);
i++;s--;
}while(s<N-1);
for (i=0;i<m;i++)
{
for (j=0;j<n;j++)
{
if (j!=0) printf(" ");
printf("%d",b[i][j]);
}
printf("\n");
}
return 0;
}```