题目链接:PAT【甲级】1105
题目简述:将给定的N个正整数按非递增的顺序,填入“螺旋矩阵”。所谓“螺旋矩阵”,是指从左上角第1 个格子开始,按顺时针螺旋方向填充,要求矩阵的规模为m行n列,满足条件:m*n=N
;m>=n
;且 m-n
取所有可能值中的小值。
#include<bits/stdc++.h>
using namespace std;
int main(){
int N, m, n, u = 0;
cin >> N;
vector<int> v(N);
for (n = sqrt(N); n >= 2;n--)
if(N % n==0)
break;
m = N / n;
vector<vector<int>> ans(m,vector<int>(n));
for (int i = 0; i < N;i++)
cin >> v[i];
sort(v.rbegin(), v.rend());
int l = 0, r = n - 1, t = 0, b = m - 1;
while(l <= r && t <= b){
for (int i = l; i <= r;i++)//右填充
ans[t][i] = v[u++];
for (int i = t + 1; i <= b;i++)//下填充
ans[i][r] = v[u++];
if(b > t){//注意条件,规避掉重复的可能
for (int i = r - 1; i >= l;i--)//左填充
ans[b][i] = v[u++];
}
if(r > l){//同上
for (int i = b - 1; i > t;i--)//上填充
ans[i][l] = v[u++];
}
l++;
t++;
b--;
r--;
}
for (int i = 0; i < m;i++){
cout << ans[i][0];
for (int j = 1; j < n;j++)
cout << " " << ans[i][j];
cout << endl;
}
return 0;
}
这个题和对于矩阵螺旋输出值的题目几乎是一模一样的,无非是两个相反的过程。但螺旋的框架过程还是一样的。