PAT乙级1050. 螺旋矩阵(C语言)

AC

PAT乙级真题题解目录


/*
 * 1. 先对输入的数组排序;
 * 2. 螺旋矩阵的行列数确定的关键:m−n 取所有可能值中的最小值;
 *	通过sqrt函数,开方再遍历,能最快地得到n;
 * 3. 螺旋矩阵的填充顺序:上 → 右 → 下 → 左;
 *	3.1 用二维数组存储螺旋矩阵(个人喜好,一位数组也可行);
 *	3.2 遍历填充二维数组,以二维数组的圈数作为遍历的次数,圈数为 n / 2 + n % 2(n <= m,每少一圈,列数-2);
 *	3.3 注意填充之后,对未填充的最上行、最右列、最下行、最左列进行更新;
 *  3.4 每遍历一次行/列后,判断是否已经遍历完所有数,跳出循环(避免后续的错误覆盖,时间的浪费);
 */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int cmp(const void *a, const void *b) {
	return *(int *)b - *(int *)a; //降序
}
int main(){
	int N, n, m;
	scanf("%d", &N);
	int arr[N];
	for (int i = 0; i < N; i++){
		scanf("%d", &arr[i]);
	}
	qsort(arr, N, sizeof(int), cmp);
	for (int i = sqrt((double)N); i >= 1; i--) {
		if (N % i == 0) {
			n = i;
			break;
		}
	}
	m = N / n;
	int matrix[m][n]; 
	int urow = 0, drow = m - 1, lcol = 0, rcol = n - 1, i = 0;
	for (int k = n / 2 + n % 2; k >= 0; k--) { //从外到里遍历的圈数 
		for (int j = lcol; j <= rcol && i != N; j++, i++) {//遍历最上行 
			matrix[urow][j] = arr[i];
		}
		urow++;//第一层遍历完毕 
		for (int j = urow; j <= drow && i != N; j++, i++) {//遍历最右列 
			matrix[j][rcol] = arr[i];
		}
		rcol--;//最后一列遍历完毕 
		for (int j = rcol; j >= lcol && i != N; j--, i++) {//倒序遍历最下行 
			matrix[drow][j] = arr[i]; 
		}
		drow--;//最后一行遍历完毕 
		for (int j = drow; j >= urow && i != N; j--, i++) {//倒序遍历最左的列 
			matrix[j][lcol] = arr[i];
		} 
		lcol++;//最左列遍历完毕 
	} 
	for (int i = 0; i < m; i++) { //输出矩阵
		for (int j = 0; j < n; j++) {
			if (j == n - 1) {
				printf("%d\n", matrix[i][j]);
			} else {
				printf("%d ", matrix[i][j]);
			}
		}
	}
	return 0;
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值