Keywords:Dynamic allocation and release of two dimensional array;sort() belongs to
NOT AC CODE:(3/5). segmentation fault
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <iomanip>
#include <cmath>
#include <algorithm>
using namespace std;
bool cmp( long long a , long long b){
return a > b;
}
int main()
{
long long N;
cin>>N;
long long m , n ;
for(long long i = (long long )sqrt(N); i < N; i ++){
//cout<<i<<endl;
if(N % i == 0){
m = N / i;
m = m > i ? m: i; //螺旋矩阵的行数m
n = N / m ; //螺旋矩阵的列数n
break;
}
}
//cout<<m<<" "<<n<<endl;
long long hang = m;
long long lie = n ;
long long *num_input;
long long **num_output;
num_input = (long long *)malloc(sizeof(long long)*N);
/*用二级指针动态申请二维数组*/
num_output = (long long **)malloc(sizeof(long long *)*N);
for(long long i = 0 ; i < m ; i ++){
num_output[i] = (long long *)malloc(sizeof(long long )*n);
}
for(long long i = 0 ; i < N ; i ++){
cin>>num_input[i];
}
sort(num_input,num_input+N,cmp);
long long i = 0;//遍历num_input[]
long long k = 0;//二维螺旋数组的行数,对应m
long long l = 0;//二维螺旋数组的列数,对应n
/*test */
/*for(long long j = 0 ; j < N ; j ++){
cout<<num_input[j]<<" ";
}
cout<<endl;
*/
while(i < N)
{
for(long long j = l ; j < n ; j++){
num_output[k][j] = num_input[i++];
//cout<<num_output[k][j]<<endl;
}//对于第k行,从左往右遍历l列,对每一个位置顺序放入数字
k++;//上半区,第K行已经放满
if( i == N) break;
// cout<<"1"<<endl;
for(long long j = k ; j < m ; j++){
num_output[j][n-1] = num_input[i++];
//cout<<num_output[j][n-1]<<endl;
}//对于第l列,从上往下遍历k行,对每一个位置顺序放入数字
n--;//上半区,第n-1列已经放满
if(i == N) break;
// cout<<"2"<<endl;
for(long long j = n-1;j > l-1 ; j --){
num_output[m-1][j] = num_input[i++];
//cout<<num_output[m-1][j]<<endl;
}//对于第k行,从右往左遍历l列,对每一个位置顺序放入数字
m--;//下半区,第m-1行已经放满
if(i == N) break;
// cout<<"3"<<endl;
for(long long j = m-1;j > k-1 ;j --){
num_output[j][l] = num_input[i++];
//cout<<num_output[k][j]<<endl;
}//对于第l列,从下往上遍历l列,对每一个位置顺序放入数字
l++;//下半区,第l列已经放满
if(i == N)break;
//cout<<"4"<<endl;
//cout<<i<<" "<<N<<endl;
}
for(k = 0 ;k < hang; k ++){
for(l = 0 ; l < lie ; l ++){
if(l == lie -1){
cout<<num_output[k][l]<<endl;
}
else{
cout<<num_output[k][l]<<" ";
}
}
}
free(num_input);
free(num_output);
return 0;
}