-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path1050.cpp
55 lines (54 loc) · 1.21 KB
/
1050.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
int main() {
int N; cin >> N;
int m, n, i, j, list[N];
for( i=0; i<N; ++i )
scanf("%d", &list[i]);
sort(list, list+N);
// found m & n
for( i=sqrt(N); i>=1; --i ) {
if(N%i == 0) {
m = i;
n = N/i;
break;
}
}
if( m<n ) {
int temp = m;
m = n;
n = temp;
}
// level
int matrix[m][n];
for( i=0; i<(n+1)/2; ++i ) {
for( j=i; j<n-i; ++j ) {
if( N == 0 ) break;
matrix[i][j] = list[--N];
}
for( j=i+1; j<m-i; ++j ) {
if( N == 0 ) break;
matrix[j][n-1-i] = list[--N];
}
for( j=n-2-i; j>=i; --j ) {
if( N == 0 ) break;
matrix[m-1-i][j] = list[--N];
}
for( j=m-2-i; j>i; --j ) {
if( N == 0 ) break;
matrix[j][i] = list[--N];
}
if( N == 0 ) break;
}
// print
for( i=0; i<m; ++i ) {
for( j=0; j<n; ++j ) {
if(!j) printf("%d", matrix[i][j]);
else printf(" %d", matrix[i][j]);
}
printf("\n");
}
return 0;
}