#include<math.h> //sqrt
#include<stdlib.h> //快速排序qsort
#include<stdio.h> //指针,malloc
#include<iostream>
using namespace std;
/*1.降序排序
2.算N=m*n,且(m-n)min
3.按 右-下-左-上 填充
*/
int cmp(const void *a,const void *b){
return *((int *)a)<*((int *)b)?1:-1; //1表示按a<b,-1表示按a>b
}
int minFactor(int N){
int n=sqrt(N); int j;
for(j=n;j>=1;j--){
if(N%j==0){
return j;
}else{
continue;
}
}
return -1;
}
int main(){
int N,m,n,i=0,j=0,position=0,direct=0;
cin>>N;
int * num=(int *) malloc (N*sizeof(int));
for(i=0;i<N;i++) cin>>num[i];
qsort(num,N,sizeof(int),cmp);
if(minFactor(N)!=-1){
n=minFactor(N); m=N/n;
}else{
cout<<"Error!"<<endl;
return 0;
}
int **matrix=(int **) malloc (m*sizeof(int *));
for(i=0;i<m;i++){
matrix[i]=(int *)malloc(n*sizeof(int));
for(j=0;j<n;j++){
matrix[i][j]=0;
}
}
while(position<N){
direct%=4;
if(direct==0){
for(;j<n && matrix[i][j]==0;j++) matrix[i][j]=num[position++];
i++;j--;
}else if(direct==1){
for(;i<m && matrix[i][j]==0;i++) matrix[i][j]=num[position++];
i--;j--;
}else if(direct==2){
for(;j>=0 && matrix[i][j]==0;j--) matrix[i][j]=num[position++];
i--;j++;
}else{
for(;i>=0 && matrix[i][j]==0;i--) matrix[i][j]=num[position++];
i++;j++;
}
direct++;
}
/*
int direction = 0; //0:right, 1:down, 2:left, 3:up
i=0;j=0;
while( position < N)
{
direction %= 4;
if(direction == 0)
{
for(; j < n && matrix[i][j] == 0; j++) matrix[i][j] = num[position++];
j--;i++;
}
else if(direction == 1)
{
for(; i < m && matrix[i][j] == 0; i++) matrix[i][j] = num[position++];
i--; j--;
}
else if(direction == 2)
{
for(; j >= 0 && matrix[i][j] == 0; j--) matrix[i][j] = num[position++];
j++; i--;
}
else
{
for(; i >= 0 && matrix[i][j] == 0; i--) matrix[i][j] = num[position++];
i++; j++;
}
direction ++;
}
*/
for(i=0;i<m;i++){
for(j=0;j<n;j++){
cout<<matrix[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
1050. 螺旋矩阵(25)
最新推荐文章于 2019-06-15 00:24:18 发布