Text Summary:
To solve this problem, there are two key points to consider:
- Calculating the values of ‘m’ and ‘n’:
for (n = sqrt(N); n >= 1; n--) {
if (N % n == 0) {
m = N / n;
break;
}
}
- How to populate a two-dimensional array in a clockwise cycle:
int level = m / 2 + m % 2;
for (i = 0; i < level; i++) {
for (j = i; j < n - i and t < N; j++)
arr[i][j] = v[t++];
for (j = i + 1; j < m - i - 1 and t < N; j++)
arr[j][n - i - 1] = v[t++];
for (j = n - i - 1; j >= i and t < N; j--)
arr[m - i - 1][j] = v[t++];
for (j = m - i - 2; j > i and t < N; j--)
arr[j][i] = v[t++];
}
Code Summary:
#include <bits/stdc++.h>
using namespace std;
bool cmp(int a, int b) {return a > b;}
int main() {
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
int N, m, n;
int i, j, t = 0;
cin >> N;
vector<int> v(N);
for (i = 0; i < N; i++)
cin >> v[i];
sort(v.begin(), v.end(), cmp);
for (n = sqrt(N); n >= 1; n--) {
if (N % n == 0) {
m = N / n;
break;
}
}
int arr[m][n];
int level = m / 2 + m % 2;
for (i = 0; i < level; i++) {
for (j = i; j < n - i and t < N; j++)
arr[i][j] = v[t++];
for (j = i + 1; j < m - i - 1 and t < N; j++)
arr[j][n - i - 1] = v[t++];
for (j = n - i - 1; j >= i and t < N; j--)
arr[m - i - 1][j] = v[t++];
for (j = m - i - 2; j > i and t < N; j--)
arr[j][i] = v[t++];
}
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
if (j) cout << ' ';
cout << arr[i][j];
}
cout << endl;
}
}