- 题目

- 思路
- 先把数据非递增排序,按特定的格式存到二维数组,最后输出二维数组
- 关键是按什么规则存入二维数组,这里按顺势针依次存储
- 但是有几个运行测试点运行超时了,参考了一下其他的代码,贴一个博主的传送门 AC代码,第二份代码可以完美通过~感谢这位博主提供参考代码~

#include <stdio.h>
#include <algorithm>
#include <cmath>
#include <string.h>
using namespace std;
bool cmp(int a,int b){
return a>=b;
}
int main(){
int N;
scanf("%d",&N);
int sqr=sqrt(N);
int arr[N];
for(int i=0;i<N;i++){
scanf("%d",&arr[i]);
}
sort(arr,arr+N,cmp);
int row,col;
for(int i=1;i<=sqr;i++){
if(N%i==0){
col=i;
}
}
row=N/col;
int ans[100][100];
memset(ans, 0, sizeof(ans));
int i=1,j=1,k=0;
while(k<N){
for(;j<col;j++){
if(ans[i][j]==0){
ans[i][j]=arr[k++];
}
if(ans[i][j+1]!=0){
break;
}
}
for(;i<row;i++){
if(ans[i][j]==0){
ans[i][j]=arr[k++];
}
if(ans[i+1][j]!=0){
break;
}
}
for(;j>1;j--){
if(ans[i][j]==0){
ans[i][j]=arr[k++];
}
if(ans[i][j-1]!=0){
break;
}
}
for(;i>1;i--){
if(ans[i][j]==0){
ans[i][j]=arr[k++];
}
if(ans[i-1][j]!=0){
break;
}
}
}
for(int i=1;i<=row;i++){
for(int j=1;j<=col;j++){
printf("%d",ans[i][j]);
if(j!=col){
printf(" ");
}
}
printf("\n");
}
return 0;
}
#include <stdio.h>
#include <algorithm>
#include <cmath>
#include <string.h>
using namespace std;
bool cmp(int a,int b){
return a>=b;
}
int main(){
int N;
scanf("%d",&N);
int sqr=sqrt(N*1.0);
int arr[N];
for(int i=0;i<N;i++){
scanf("%d",&arr[i]);
}
sort(arr,arr+N,cmp);
int row,col,min=9999;
for(int i=1;i<=sqr;i++){
if(N%i==0){
if(N/i-i<min){
min=N/i-i;
col=i;
}
}
}
row=N/col;
int ans[100][100]={0};
memset(ans, 0, sizeof(ans));
int i=1,j=1,k=0;
ans[1][1]=arr[0];
while(k<row*col-1){
while(j+1<=col&&!ans[i][j+1]){
ans[i][++j]=arr[++k];
}
while(i+1<=row&&!ans[i+1][j]){
ans[++i][j]=arr[++k];
}
while(j-1>0&&!ans[i][j-1]){
ans[i][--j]=arr[++k];
}
while(i-1>0&&!ans[i-1][j]){
ans[--i][j]=arr[++k];
}
}
for(int i=1;i<=row;i++){
printf("%d",ans[i][1]);
for(int j=2;j<=col;j++){
printf(" %d",ans[i][j]);
}
printf("\n");
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int a[10000][1000]={0},s[10000];
bool cmp(int a,int b){
return a>b;
}
int main(){
int n,i,j,x,y,r,c,tot,minn=9999;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&s[i]);
}
sort(s,s+n,cmp);
for(i=1;i<=sqrt(n*1.0);i++)
{
if(n%i==0)
{
if(n/i-i<minn){
minn=n/i-i;
r=i;
}
}
}
c=n/r;
a[1][1]=s[0];
tot=0;
x=y=1;
while(tot < r * c-1)
{
while(y + 1 <= r && ! a[x][y + 1])
a[x][++y] = s[++tot];
while(x + 1 <= c && !a[x + 1][y])
a[++x][y] = s[++tot];
while(y - 1 > 0 && !a[x][y - 1])
a[x][--y] = s[++tot];
while(x - 1 > 0 && !a[x - 1][y])
a[--x][y] = s[++tot];
}
for(i=1;i<=c;i++){
printf("%d",a[i][1]);
for(j=2;j<=r;j++){
printf(" %d",a[i][j]);
}
printf("\n");
}
return 0;
}