1050 螺旋矩阵 二维矩阵 难度较大
作者:互联网
问题分解
- 数组倒序排列
- 指定正整数,求其两个最接近的因子m、n
- 顺时针螺旋矩阵打印
注意点
- 二维数组
代码
#include <iostream>
#include <cstdio>
#include <set>
#include <vector>
using namespace std;
int main(){
int N;
int a;
int m,n;
int level;
multiset<int> st;
vector<int> vi;
vector<int> vi2;
cin>>N;
for(int i=0;i<N;i++){//st->倒序排列
cin>>a;
st.insert(a);
}
for(int i=1;i<=N;i++){//求m、n
if(N%i==0){
vi.push_back(i);
}
}
if(vi.size()%2==0){//偶数
n=vi[vi.size()/2-1];
m=vi[vi.size()/2];
}
else{
m=vi[(vi.size()-1)/2];
n=vi[(vi.size()-1)/2];
}
vector<vector<int> > array(m);
for(int i=0;i<m;i++){
array[i].resize(n);
}
for(multiset<int>::reverse_iterator rit=st.rbegin();rit!=st.rend();rit++){
vi2.push_back(*rit);
}
level=n/2+n%2;
int tmp=0;
for(int i=0;i<level;i++){
for(int j=i;j<=n-i-1&&tmp<=N;j++){
array[i][j]=vi2[tmp];
tmp++;
}
for(int j=i+1;j<m-1-i&&tmp<=N;j++){
array[j][n-i-1]=vi2[tmp];
tmp++;
}
for(int j=n-i-1;j>=i&&tmp<=N;j--){
array[m-1-i][j]=vi2[tmp];
tmp++;
}
for(int j=m-2-i;j>=i+1&&tmp<=N;j--){
array[j][i]=vi2[tmp];
tmp++;
}
}
for(int i=0;i<m;i++){
if(i==0){
;
}
else{
cout<<endl;
}
for(int j=0;j<n;j++){
if(j==0){
cout<<array[i][j];
}
else{
cout<<" "<<array[i][j];
}
}
}
return 0;
}
参考
1050. 螺旋矩阵(25)-PAT乙级真题_柳婼的博客-CSDN博客
标签:1050,tmp,int,rit,矩阵,st,二维,include 来源: https://www.cnblogs.com/wodeblog1982/p/16462735.html