其他分享
首页 > 其他分享> > 1050 螺旋矩阵 (25 分)

1050 螺旋矩阵 (25 分)

作者:互联网

一、题目

在这里插入图片描述

二、题解

#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;

int N, m, n;  // 输入N个数,m为行数,n为列数 

bool cmp(int a, int b){  // 按非递增顺序排列 
	if(a != b) return a > b;
}

int findMN(int c){  // 找出满足条件的最大列数n 
	int maxCol;
	for(int i=(int)sqrt(N); i>=1; i--){
		if(N % i == 0){
			maxCol = i;
			return maxCol;
		}
	}
}

int main(){
	scanf("%d", &N);
	int num[N];
	n = findMN(N);  // 得到列数 
	m = N / n;  // 得到行数
	int mat[m][n];
	for(int k=0; k<N; k++) scanf("%d", &num[k]);
	sort(num, num+N, cmp);  // 按非递增顺序排列 
	for(int row=0; row<m; row++){  // 二维矩阵初始化
		for(int col=0; col<n; col++){
			mat[row][col] = 0;
		}
	}
	bool isIncrease = 1;  // 值为1时表示按顺序递增,否则递减
	int p=0, q=-1, k=0;  // p控制水平方向,q控制垂直方向
	int mm = m, nn = n; // 保存行数和列数用于最后输出
	/* k为num数组顺序输出时的下标,每输出一个数k++ */
	while(m && n){
		for(int cnt=0; cnt<n; cnt++){  // 遍历第i行 
			isIncrease ? q++ : q--;
			mat[p][q] = num[k++];
		}
		m--;  // 行数减1
		for(int cnt=0; cnt<m; cnt++){  // 遍历第j列 
			isIncrease ? p++ : p--;
			mat[p][q] = num[k++];
		}
		n--;  // 列数减1
		isIncrease ? isIncrease = 0 : isIncrease = 1;  // 方向转换 
	} 
	for(int row=0; row<mm; row++){
		for(int col=0; col<nn; col++){
			if(col != nn-1) printf("%d ", mat[row][col]);
			else printf("%d\n", mat[row][col]);
		}
	}
	return 0;
}

标签:1050,25,maxCol,return,int,矩阵,列数,findMN,include
来源: https://blog.csdn.net/weixin_43509263/article/details/88730328