pat乙级真题 1050. 螺旋矩阵(25)

题目链接

                   点击打开链接


注意事项
1 不能设置二维数组来存储矩形,要用一维数组来存储。 2 把每层赋值到矩阵时,要注意该行或该列是否还需要赋值。如7*1的矩阵,赋值了右边列时,左边列就不能赋值了,因为只有一列。         
代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

void quick_sort(int a[],int first,int end){
	int i, j,
		temp = a[first];
	i = first;
	j = end;
	if (i<j){
		while (i < j){
			while (i < j && a[j] >= temp) j--;
			a[i] = a[j];
			while (i<j && a[i]<=temp) i++;
			a[j] = a[i];
		}
		a[i] = temp;
		quick_sort(a,first,i-1);
		quick_sort(a, i+1, end);
	}
}
int main(){
	int N, i, j, n, m;
	int  juzheng[10002],input[10100];
	scanf("%d", &N);
	for (i = 0; i < N; i++){
		scanf("%d", &input[i]);
	}
	quick_sort(input, 0, N - 1);

	for (i = 1; i <= sqrt((double)N); i++){//找出满足m*n == N 且m -n 最小
		if (N%i == 0){
			m = N / i;
			n = i;
		}
	}
	
	int  count, input_num;
	input_num = N - 1;  //我的排序为递增,所以最后一个元素为最大。
	count = 0;         //标志层数
	
	while (2 * count < m || 2 * count < n){ //注意输出改行或该列前,是否还需要输出。上边行和右边列需要满足m - 2 * count >0,才需要输出;下边行和左边列需要m - 2 * count >1才需要输出
		for (i = count; i < n - count && m - 2 * count >0; i++){ //一层中的上方的行
			juzheng[count* n +i] = input[input_num--];
		}
		for (i = count + 1; i < m - count && n - 2 * count >0; i++){//一层中右边的列
			juzheng[i * n + n - 1 - count] = input[input_num--];
		}
		for (i = n - count - 2; i >= count && m - 2 * count >1; i--){//一层中下方的行
			juzheng[(m - 1 -count)* n + i] = input[input_num--];
		}
		for (i = m - 2 - count; i > count && n - 2 * count >1;i--){//一层中左边的列。
			juzheng[i * n +count] = input[input_num--];
		}
	count++; //层数+1
	}

	for (i = 0; i < m;i++){ //输出矩阵
		for (j = 0; j < n;j++){
			if (j == n-1)
				printf("%d\n", juzheng[i*n +j]);
			else
				printf("%d ", juzheng[i*n+j]);
		}
	}

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值