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