不加判断是否是最后一个N,最后一个测试点总过不了。
https://www.cnblogs.com/wanghao-boke/p/9574335.html
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn = 10010; //数字不能太大
int matrix[maxn][maxn],A[maxn];
bool cmp(int a,int b){
return a > b;
}
int main(){
int N;
scanf("%d",&N);
fill(A,A+N,-1);
for(int i = 0; i < N; i++){
scanf("%d",&A[i]);
}
if(N == 1){
printf("%d",A[0]);
return 0;
}
sort(A,A+N,cmp);
int m = (int)ceil(sqrt(1.0*N));
while(N % m != 0) m++; //除不整的时候m++
int n = N / m, i = 1, j = 1, now = 0;
int U = 1, D = m, L = 1, R = n;
while(now < N){
while(now < N && j < R){
matrix[i][j] = A[now++];
j++;
}
while(now < N && i < D){
matrix[i][j] = A[now++];
i++;
}
while(now < N && j > L){
matrix[i][j] = A[now++];
j--;
}
while(now < N && i > U){
matrix[i][j] = A[now++];
i--;
}
U++,D--,L++,R--;
i++,j++;
//没有这个第二个测试点过不了
if(now == N - 1){
matrix[i][j] = A[now++];
break;
return 0;
}
}
for(int i = 1; i <= m; i++){
for(int j = 1; j <= n; j++){
printf("%d",matrix[i][j]);
if(j < n) printf(" "); //j < n,不是j < n - 1
else printf("\n");
}
}
return 0;
}