[PAT][Basic Level]1050

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;	
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值