import
java.util.*;
class
Program {
static
void
fill(List<Pair<Integer, Integer>> temp, PriorityQueue<Pair<Integer, Integer>> q,
int
[][] grid) {
Pair<Integer, Integer> it = q.peek();
q.poll();
if
(it.getFirst() < temp.size()) {
System.out.println(
"No"
);
System.exit(
0
);
}
for
(Pair<Integer, Integer> c : temp) {
grid = it.getSecond();
}
it.setFirst(it.getFirst() - temp.size());
q.offer(it);
}
static
void
checkPalindrome(
int
[] A,
int
N) {
Map<Integer, Integer> mp =
new
HashMap<>();
PriorityQueue<Pair<Integer, Integer>> q =
new
PriorityQueue<>(Collections.reverseOrder(Comparator.comparing(Pair::getFirst)));
int
[][] grid =
new
int
[N][N];
for
(
int
c =
0
; c < N * N; c++) {
mp.put(A, mp.getOrDefault(A,
0
) +
1
);
}
for
(Map.Entry<Integer, Integer> entry : mp.entrySet()) {
q.offer(
new
Pair<>(entry.getValue(), entry.getKey()));
}
int
m = N /
2
;
List<Pair<Integer, Integer>> temp =
new
ArrayList<>();
for
(
int
i =
0
; i < m; i++) {
for
(
int
j =
0
; j < m; j++) {
int
revI = N - i -
1
;
int
revJ = N - j -
1
;
temp.addAll(Arrays.asList(
new
Pair<>(i, j),
new
Pair<>(revI, j),
new
Pair<>(i, revJ),
new
Pair<>(revI, revJ)
));
fill(temp, q, grid);
temp.clear();
}
}
if
(N %
2
==
1
) {
for
(
int
i =
0
; i < m; i++) {
temp.addAll(Arrays.asList(
new
Pair<>(i, m),
new
Pair<>(N - i -
1
, m)
));
fill(temp, q, grid);
temp.clear();
temp.addAll(Arrays.asList(
new
Pair<>(m, i),
new
Pair<>(m, N - i -
1
)
));
fill(temp, q, grid);
temp.clear();
}
temp.add(
new
Pair<>(m, m));
fill(temp, q, grid);
}
System.out.println(
"Yes"
);
for
(
int
i =
0
; i < N; i++) {
for
(
int
j =
0
; j < N; j++) {
System.out.print(grid[i][j] +
" "
);
}
System.out.println();
}
}
public
static
void
main(String[] args) {
int
[] A = {
1
,
1
,
1
,
1
,
2
,
3
,
3
,
4
,
4
};
int
N = (
int
) Math.sqrt(A.length);
checkPalindrome(A, N);
}
}
class
Pair<K, V> {
private
K first;
private
V second;
Pair(K first, V second) {
this
.first = first;
this
.second = second;
}
K getFirst() {
return
first;
}
void
setFirst(K first) {
this
.first = first;
}
V getSecond() {
return
second;
}
void
setSecond(V second) {
this
.second = second;
}
}