PAT甲级——1105 Spiral Matrix——分数 25
题目

螺旋填充数组
解法1
点击查看代码
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main(){
int N; cin >> N;
vector<int> vi(N);
for(int i = 0; i < N; i++) cin >> vi[i];
// 排序要降序排列
sort(vi.begin(), vi.end(), greater<int>());
// 找m和n,使得m*n=N,且m>=n且m最小
int m = N, n = 1;
for(int i = 1; i*i <= N; i++){
if(N % i == 0){
m = N / i;
}
}
n = N / m;
vector<vector<int>> ans(m, vector<int>(n, 0));
int top = 0, bottom = m-1, left = 0, right = n-1;
int idx = 0;
while(idx < N){
for(int i = left; i <= right && idx < N; i++) ans[top][i] = vi[idx++];
top++;
for(int i = top; i <= bottom && idx < N; i++) ans[i][right] = vi[idx++];
right--;
for(int i = right; i >= left && idx < N; i--) ans[bottom][i] = vi[idx++];
bottom--;
for(int i = bottom; i >= top && idx < N; i--) ans[i][left] = vi[idx++];
left++;
}
// 输出
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
printf((j>0)?" %d":"%d",ans[i][j]);
// if(j > 0) cout << " ";
// cout << ans[i][j];
}
cout << endl;
}
return 0;
}
浙公网安备 33010602011771号