螺旋矩阵
给定一个包含 N 个正整数的序列,请你将序列中的元素以非递增顺序填充到螺旋矩阵中。
从左上角的第一个元素开始填充,并按照顺时针方向旋转。
要求矩阵有 m 行 n 列,并且 m,n 满足:
m×n=N,
m≥n,
m−n 尽可能小
输入格式:
第一行包含整数 N,1≤N≤10000。
第二行包含 N 个整数,1≤ 序列中元素 ≤10000。
输出格式:
输出填充好的 m×n 的矩阵。
数字之间用一个空格隔开,结尾不得有多余空格。
输入样例:
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
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
void fill(int **,int,int,int *);
void sort(int *,int);
void calculate(int,int *,int *);
int main(){
int n,N,m;
scanf("%d",&N);
calculate(N,&m,&n);
int *p=(int *)malloc(sizeof(int)*N);
int **arr=(int **)malloc(sizeof(int *)*m);
for(int i=0;i<m;i++){
arr[i]=(int *)malloc(sizeof(int)*n);
}
for(int i=0;i<N;i++){
scanf("%d",&p[i]);
}
//排序
sort(p,N);
//填充到arr
fill(arr,m,n,p);
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
printf("%d",arr[i][j]);
if(j!=n-1)
printf(" ");
}
printf("\n");
}
for(int i=0;i<m;i++){
free(arr[i]);
}
free(p);
free(arr);
return 0;
}
void calculate(int N,int *m,int *n){
float t;
t=sqrt(N);
if(t>(int)t){
*m=(int)t+1;
*n=(int)t;
}else if((int)t==t){
*m=t;
*n=t;
}
if((*m)*(*n)!=N){
*n=(int)t;
while(N%(*n)!=0){
(*n)--;
}
*m=N/(*n);
}
}
void sort(int *p,int N){
int t;
for(int i=1;i<N;i++){
for(int i=1;i<N;i++){
if(p[i]>p[i-1]){
t=p[i-1];
p[i-1]=p[i];
p[i]=t;
}
}
}
}
void fill(int **arr,int m,int n,int *p){
int flag=1;// 1右移 2下移 3左移 4上移
int count=0,sum=m*n,i=0,j=0;
int up=0,down=m,left=0,right=n;
while(count<sum){
while(flag==1&&j<right){
arr[i][j++]=p[count++];
if(j==right){
up++;
i=up;
j=right-1;
flag=2;
break;
}
}
while(flag==2&&i<down){
arr[i++][j]=p[count++];
if(i==down){
right--;
i=down-1;
j=right-1;
flag=3;
break;
}
}
while(flag==3&&j>=left){
arr[i][j--]=p[count++];
if(j==left-1){
down--;
i=down-1;
j=left;
flag=4;
break;
}
}
while(flag==4&&i>=up){
arr[i--][j]=p[count++];
if(i==up-1){
left++;
i=up;
j=left;
flag=1;
break;
}
}
}
}