1050. 螺旋矩阵(25)
本题要求将给定的N个正整数按非递增的顺序,填入“螺旋矩阵”。所谓“螺旋矩阵”,是指从左上角第1个格子开始,按顺时针螺旋方向填充。要求矩阵的规模为m行n列,满足条件:m*n等于N;m>=n;且m-n取所有可能值中的最小值。
输入格式:
输入在第1行中给出一个正整数N,第2行给出N个待填充的正整数。所有数字不超过104,相邻数字以空格分隔。
输出格式:
输出螺旋矩阵。每行n个数字,共m行。相邻数字以1个空格分隔,行末不得有多余空格。
输入样例:12
37 76 20 98 76 42 53 95 60 81 58 93
输出样例:
98 95 93
42 37 81
53 20 76
58 60 76
这道题先是一个简单的排序,后面是按照题目意思来的矩阵排列。这里个人也没什么好的建议,就是慢慢调试,我真的第一次做的时候根据输出调试了好多次。当时做这道题,电脑还有点问题1000*1000的矩阵都定义不出来,只能先用10*10的,最后调试好了才在交的时候改了数据,一把辛酸泪。这是我的代码:
#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++) //从大到小排序
{
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;
}