核心部分参考了柳神的代码,需要重做。薄弱项
#include<cstdio>
#include<vector>
#include<algorithm>
#include<cmath>
#define maxn 505
#define inf 1000000000
using namespace std;
vector<int> num;
int graph[maxn][maxn];
bool com(int a, int b) {
return a >= b;
}
void getmn(int N, int &m, int &n) {
for (m = 1; m * m < N; m++) {}
while(N % m != 0) {
m++;
}
n = N / m;
}
void draw(int N, int m, int n) {
int now = 0;
int level = m / 2 + m % 2; // ceil(m / 2);
for (int i = 0; i < level; i++) {
for (int j = i; j <= n - 1 - i && now <= N - 1; j++)
graph[i][j] = num[now++];
for (int j = i + 1; j <= m - 2 - i && now <= N - 1; j++)
graph[j][n - 1 - i] = num[now++];
for (int j = n - i - 1; j >= i && now <= N - 1; j--)
graph[m - 1 - i][j] = num[now++];
for (int j = m - 2 - i; j >= i + 1 && now <= N - 1; j--)
graph[j][i] = num[now++];
}
return;
}
int main() {
int N, a;
scanf("%d", &N);
for (int i = 0; i < N; i++) {
scanf("%d", &a);
num.push_back(a);
}
sort(num.begin(), num.end(), com);
int m, n;
getmn(N, m, n);
draw(N, m, n);
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
printf("%d", graph[i][j]);
if (j != n - 1) printf(" ");
}
printf("\n");
}
return 0;
}