分析:
/*
1. 算出m(行)、n(列)的值。2. 由于n比较小,因此根据n算出矩阵的圈数。
3. 根据圈数填充矩阵
*/
核心处理部分就是矩阵的填充。
修改一下fillMatrix中圈数循环中各个小循环的边界,可以省略if语句,同时也成为了通用一些的螺旋矩阵填充算法(不论m、n的大小)。
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
void calcRowAndCol(int &num, int &row, int &col);
void fillMatrix(int *ori, int **dst, int &m, int &n);
int main(void) {
int num;
cin >> num;
int *ia = new int[num]; //保存输入数据
for(int i(0); i < num; ++i)
cin >> ia[i];
sort(ia, ia+num, [](int &a, int &b) { return a > b; }); //降序排序
int m, n; //矩阵的行列
calcRowAndCol(num, m, n);
int **matrix = new int*[m]; //二维数组
for(int i(0); i < m; ++i)
matrix[i] = new int[n];
fillMatrix(ia, matrix, m, n);
for(int i(0); i < m; ++i) {
cout << matrix[i][0];
for(int j(1); j < n; ++j)
cout << " " << matrix[i][j];
cout << endl;
}
// delete []ia;
// for(int i(0); i < m; ++i)
// delete []matrix[i];
// delete []matrix;
return 0;
}
void calcRowAndCol(int &num, int &row, int &col) {
row = sqrt(num);
while(num%row != 0) ++row;
col = num / row;
if(col > row) swap(row, col);
}
void fillMatrix(int *ori, int **dst, int &m, int &n) {
int level = n / 2; //n是偶数的情况下,矩阵的圈数
int index(0);
for(int i(0); i < level; ++i) {
//top
for(int col(i); col < n-1-i; ++col)
dst[i][col] = ori[index++];
//right
for(int row(i); row < m-1-i; ++row)
dst[row][n-1-i] = ori[index++];
//bottom
for(int col(n-1-i); col > i; --col)
dst[m-1-i][col] = ori[index++];
//left
for(int row(m-1-i); row > i; --row)
dst[row][i] = ori[index++];
}
//n是奇数,最后一圈(列状),特别处理。
if(n%2 == 1) {
int rest = m - 2*level;
for(int i(0); i < rest; ++i)
dst[level + i][level] = ori[index++];
}
}