本题就是将所给的一系列数进行排序,然后数字以从大到小的方式,以顺时针圆圈(我也不知道这样说法能不能让别人理解,具体可参照题目和给出的样例)的形式输出
由于printf()函数只能一行一行的输出,所以造就了本题的难度。说实在话,之前刷乙级的时候,我也没写出这道题。前天刚写完甲级的一道题1082 Read Number in Chinese,看了《算法笔记上机训练实战指南》的题解,再看到这道题时,就有了一点想法。不过说实话,我自己的这份代码写的有些冗长和啰嗦,不如《算法笔记上机训练实战指南》的题解代码好
#include <cstdio>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
bool cmp(int a, int b){
return a>b;
}
int main()
{
int n, a;
scanf("%d", &n);
vector<int> v;
for(int i=0; i<n; i++){
scanf("%d", &a);
v.push_back(a);
}
sort(v.begin(), v.end(), cmp);
int x=(int)sqrt(1.0*n);
if(x*x<n){
while(1){
x+=1;
if(n%x==0)
break;
}
}
int y=n/x;
int matrix[x][y];
bool vis[x][y];
fill(vis[0], vis[0]+x*y, false);
int ul=0, ur=y-1, ru=0, rd=x-1, dl=0, dr=y-1, lu=1, ld=x-1;
int index=0;
while(index<n){
for(int i=ul; i<=ur; i++){
if(!vis[ru][i]){
matrix[ru][i]=v[index];
vis[ru][i]=true;
index+=1;
}
}
ru+=1;
for(int i=ru; i<=rd; i++){
if(!vis[i][dr]){
matrix[i][dr]=v[index];
index+=1;
vis[i][dr]=true;
}
}
rd-=1;
dr-=1;
for(int i=dr; i>=dl; i--){
if(!vis[ld][i]){
matrix[ld][i]=v[index];
index+=1;
vis[ld][i]=true;
}
}
ld-=1;
for(int i=ld; i>=lu; i--){
if(!vis[i][ul]){
matrix[i][ul]=v[index];
index+=1;
vis[i][ul]=true;
}
}
ul+=1;
ur-=1;
lu+=1;
dl+=1;
}
for(int i=0; i<x; i++){
for(int j=0; j<y; j++){
printf("%d", matrix[i][j]);
if(j!=y-1)
printf(" ");
else
printf("\n");
}
}
return 0;
}