import
java.util.*;
class
ThreeDLinkedListNode {
int
val;
ThreeDLinkedListNode front, back, up, right, down, left;
ThreeDLinkedListNode(
int
x) {
this
.val = x;
}
List<Integer> extractNeighbors() {
List<Integer> neighbour =
new
ArrayList<>();
neighbour.add(front.val);
neighbour.add(back.val);
neighbour.add(left.val);
neighbour.add(right.val);
neighbour.add(up.val);
neighbour.add(down.val);
return
neighbour;
}
}
public
class
Main {
static
void
setDown(
int
[][][] a,
int
layer,
int
row,
int
column, ThreeDLinkedListNode node) {
ThreeDLinkedListNode head = node;
for
(
int
i =
0
; i < layer; i++) {
ThreeDLinkedListNode start_layer_head = node;
for
(
int
j =
0
; j < column; j++) {
ThreeDLinkedListNode start = node;
for
(
int
k =
0
; k < row; k++) {
if
(k == row -
1
)
node.down = start;
else
node.down =
new
ThreeDLinkedListNode(a[i][k +
1
][j]);
node = node.down;
}
if
(j == column -
1
) {
node.right = start_layer_head;
if
(i < layer -
1
) {
start_layer_head.back =
new
ThreeDLinkedListNode(a[i +
1
][
0
][
0
]);
node = start_layer_head.back;
}
else
{
start_layer_head.back = head;
node = start_layer_head.back;
}
}
else
{
node.right =
new
ThreeDLinkedListNode(a[i][
0
][j +
1
]);
node = node.right;
}
}
}
}
static
void
setUp(
int
[][][] a,
int
layer,
int
row,
int
column, ThreeDLinkedListNode node) {
ThreeDLinkedListNode head = node;
for
(
int
i =
0
; i < layer; i++) {
ThreeDLinkedListNode start_layer_head = node;
for
(
int
j =
0
; j < column; j++) {
ThreeDLinkedListNode start = node;
for
(
int
k =
0
; k < row; k++) {
node.down.up = node;
node = node.down;
}
if
(j == column -
1
) {
node = start_layer_head.back;
}
else
{
node = node.right;
}
}
}
}
static
void
setRight(
int
[][][] a,
int
layer,
int
row,
int
column, ThreeDLinkedListNode node) {
ThreeDLinkedListNode head = node;
for
(
int
i =
0
; i < layer; i++) {
ThreeDLinkedListNode start_layer_head = node;
for
(
int
j =
0
; j < column; j++) {
ThreeDLinkedListNode start = node;
for
(
int
k =
0
; k < row; k++) {
node.down.right = node.right.down;
node = node.down;
}
if
(j == column -
1
) {
node = start_layer_head.back;
}
else
{
node = node.right;
}
}
}
}
static
void
setLeft(
int
[][][] a,
int
layer,
int
row,
int
column, ThreeDLinkedListNode node) {
ThreeDLinkedListNode head = node;
for
(
int
i =
0
; i < layer; i++) {
ThreeDLinkedListNode start_layer_head = node;
for
(
int
j =
0
; j < column; j++) {
ThreeDLinkedListNode start = node;
for
(
int
k =
0
; k < row; k++) {
node.right.left = node;
node = node.down;
}
if
(j == column -
1
) {
node = start_layer_head.back;
}
else
{
node = node.right;
}
}
}
}
static
void
setBack(
int
[][][] a,
int
layer,
int
row,
int
column, ThreeDLinkedListNode node) {
ThreeDLinkedListNode head = node;
for
(
int
i =
0
; i < layer; i++) {
ThreeDLinkedListNode start_layer_head = node;
for
(
int
j =
0
; j < column; j++) {
ThreeDLinkedListNode start = node;
for
(
int
k =
0
; k < row; k++) {
node.down.back = node.back.down;
node = node.down;
}
if
(j == column -
1
) {
node = start_layer_head.back;
}
else
{
node = node.right;
node.back = start.back.right;
}
}
}
}
static
void
setFront(
int
[][][] a,
int
layer,
int
row,
int
column, ThreeDLinkedListNode node) {
ThreeDLinkedListNode head = node;
for
(
int
i =
0
; i < layer; i++) {
ThreeDLinkedListNode start_layer_head = node;
for
(
int
j =
0
; j < column; j++) {
ThreeDLinkedListNode start = node;
for
(
int
k =
0
; k < row; k++) {
node.back.front = node;
node = node.down;
}
if
(j == column -
1
) {
node = start_layer_head.back;
}
else
{
node = node.right;
node.back = start.back.right;
}
}
}
}
static
ThreeDLinkedListNode threeDimensionalMatrixToLinkedList(
int
[][][] a,
int
layer,
int
row,
int
column) {
ThreeDLinkedListNode head =
new
ThreeDLinkedListNode(a[
0
][
0
][
0
]);
setDown(a, layer, row, column, head);
setUp(a, layer, row, column, head);
setRight(a, layer, row, column, head);
setLeft(a, layer, row, column, head);
setBack(a, layer, row, column, head);
setFront(a, layer, row, column, head);
return
head;
}
static
void
printOutput(
int
[][][] mat, ThreeDLinkedListNode head,
int
layer,
int
row,
int
column) {
ThreeDLinkedListNode rest;
for
(
int
i =
0
; i < layer; i++) {
rest = head.back;
for
(
int
j =
0
; j < row; j++) {
ThreeDLinkedListNode temp = head.down;
for
(
int
k =
0
; k < column; k++) {
System.out.print(mat[i][j][k] +
"\t"
);
List<Integer> neighbors = head.extractNeighbors();
for
(
int
ne : neighbors)
System.out.print(ne +
"\t"
);
System.out.println();
head = head.right;
}
head = temp;
}
head = rest;
}
}
public
static
void
main(String[] args) {
int
layer =
3
, row =
3
, column =
3
;
int
[][][] mat = {
{ {
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
} }
};
ThreeDLinkedListNode head = threeDimensionalMatrixToLinkedList(mat, layer, row, column);
System.out.println(
"element\tfront\tback\tleft\tright\tup\tdown"
);
printOutput(mat, head, layer, row, column);
}
}