给定一个包含 N 个正整数的序列,请你将序列中的元素以非递增顺序填充到螺旋矩阵中。
从左上角的第一个元素开始填充,并按照顺时针方向旋转。
要求矩阵有 m 行 n 列,并且 m,n 满足:
m×n=N,
m≥n,
m−n 尽可能小
输入格式:
第一行包含整数 N,1≤N≤10000。
第二行包含 N 个整数,1≤ 序列中元素 ≤10000。
输出格式:
输出填充好的 m×n 的矩阵。
数字之间用一个空格隔开,结尾不得有多余空格。
输入样例:
12
37 76 20 98 76 42 53 95 60 81 58 93
输出样例:
98 95 93
42 37 81
53 20 76
58 60 76
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N = 2e5 + 10;
ll n, m, num, f, len, T, k;
ll x[N];
ll a[1010][1010];
ll dir[4][2] = {0, 1, 1, 0, 0, -1, -1, 0};
void dfs(ll tx, ll ty, ll idx, ll fx) {//idx 下标 fx 方向(0,1,2,3,四个方向)
if (idx > n * m)return;
a[tx][ty] = x[idx];
ll xx = tx + dir[fx][0];
ll yy = ty + dir[fx][1];
if (xx >= 1 && xx <= n && yy >= 1 && yy <= m && a[xx][yy] == 0) {// 判断越界
dfs(xx, yy, idx + 1, fx % 4);
return;
}
xx = tx + dir[(fx + 1) % 4][0];
yy = ty + dir[(fx + 1) % 4][1];
dfs(xx, yy, idx + 1, (fx + 1) % 4);//如果越界就换方向
}
int main() {
cin >> n;
for (ll i = 1; i <= n; i++)cin >> x[i];
sort(x + 1, x + n + 1, greater<ll>());
for (ll i = sqrt(n); i >= 1; i--) { //计算边长
if (n % i == 0) {
m = i;
n /= i;
break;
}
}
dfs(1, 1, 1, 0);
for (ll i = 1; i <= n; i++) {
for (ll j = 1; j <= m; j++) {
if (j != 1)cout << " ";
cout << a[i][j];
}
cout << endl;
}
}