本题为pat上一道题目,题意很简单,将一个数组元素按照从大到小的顺序顺时针存放在一个行数和列数之差最小的矩阵中,矩阵行数大于列数。本题处理过程很简单,首先判断是在顺时针的哪个时段(t=?),然后填写到对应一个位置,再判断下一个位置并相应的时段。代码如下:
#include<iostream>
#include<vector>
#include<math.h>
#include<algorithm>
using namespace std;
void func(vector<int> const &nums,int a,int b)
{
int a0=0,b0=0,a1=0,b1=b;
int t = 0;
vector<vector<int>> matrix(a,vector<int>(b,-1));
for(int i=0;i<nums.size();++i)
{
matrix[a0][b0]=nums[i]; //各if语句中均执行该语句,提前
if(t==0)
{
if(b0+1<b1&&matrix[a0][b0+1]==-1){
b0++;
}
else
{
a0++;
t = 1;
}
}
else if(t==1){
if(a0+1<a&&matrix[a0+1][b0]==-1)
{
a0++;
}
else{
b0--;
t=2;
}
}
else if(t==2)
{
if(b0-1>=0&&matrix[a0][b0-1]==-1)
{
b0--;
}
else
{
a0--;
t=3;
}
}
else
{
if(a0-1>=0&&matrix[a0-1][b0]==-1)
{
a0--;
}
else
{
b0++;
t=0;
}
}
}
for(int i=0;i<a;++i)
{
for(int j=0;j<b;++j)
{
cout<<matrix[i][j];
if(j==b-1)cout<<endl;
else cout<<" ";
}
}
}
bool cmp(int a,int b){
return a>b;
}
int main()
{
int n;
cin>>n;
vector<int> nums(n);
for(int i=0;i<n;++i)
{
cin>>nums[i];
}
int b = sqrt(double(n));
int a = n/b;
while(b>1&&n%b!=0){//寻找满足n%b==0的最大的b。
--b;
a=n/b;
}
sort(nums.begin(),nums.end(),cmp);
func(nums,a,b);
return 0;
}