题目
思路
其实题目并不难,难点在于如何把数据存进去,关于数据的存储,我并不推荐柳神的方法(可能是我太菜了,感觉那样好麻烦),我更习惯于设置上、下、左、右的边界,这样好理解,也不方便出错
代码
#include <iostream>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
bool cmp(int a, int b){
return a>b;
}
int main(){
int n;
int row, col;
cin >> n;
vector<int> a(n);//存放输入数据
for(int i=0; i<n; i++){
cin >> a[i];
}
sort(a.begin(), a.end(), cmp);//排序
col = (int)sqrt(n);
// 计算行列
for(; col>=1; col--){
if(n % col == 0){
row = n / col;
break;
}
}
int t = 0;
int left = 0;
int right = col - 1;
int top = 0;
int bottom = row - 1;
vector<vector<int> > res(row, vector<int>(col));//结果矩阵
while(t < n){
// 从左往右
for(int i=left; i<=right && t<n; i++){
res[top][i] = a[t++];
}
// 从上到下
for(int i=top+1; i<=bottom && t<n; i++){
res[i][right] = a[t++];
}
// 从右到左
for(int i=right-1; i>=left && t<n; i--){
res[bottom][i] = a[t++];
}
// 从下到上
for(int i=bottom-1; i>=top+1 && t<n; i--){
res[i][left] = a[t++];
}
top++;
bottom--;
left++;
right--;
}
// 输出
for(int i=0; i<row; i++){
for(int j=0; j<col; j++){
printf("%d", res[i][j]);
if(j < col-1) printf(" ");
}
printf("\n");
}
return 0;
}
参考文献
https://blog.csdn.net/liuchuo/article/details/52123228
https://blog.csdn.net/shepherd2010/article/details/71727911?utm_medium=distribute.pc_relevant_right.none-task-blog-searchFromBaidu-10.channel_param_right&depth_1-utm_source=distribute.pc_relevant_right.none-task-blog-searchFromBaidu-10.channel_param_right