import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printMatrix(int [][] matrix) {
ArrayList<Integer> ans = new ArrayList<>();
int m = matrix.length;
int n = matrix[0].length;
trav(ans, matrix, 0, m - 1, 0, n - 1, false);
return ans;
}
public void trav(ArrayList<Integer> ans, int[][] matrix, int x0, int x1, int y0, int y1, boolean rev) {
if(x0 > x1 || y0 > y1) {
return;
}
if(x0 == x1) {
if(rev) {
for(int i = y1; i >= y0; i--) {
ans.add(matrix[x0][i]);
}
} else {
for(int i = y0; i <= y1; i++) {
ans.add(matrix[x0][i]);
}
}
return;
}
if(y0 == y1) {
if(rev) {
for(int i = x1; i >= x0; i--) {
ans.add(matrix[i][y0]);
}
} else {
for(int i = x0; i <= x1; i++) {
ans.add(matrix[i][y0]);
}
}
return;
}
trav(ans, matrix, x0, x0, y0, y1, false);
trav(ans, matrix, x0 + 1, x1 - 1, y1, y1, false);
trav(ans, matrix, x1, x1, y0, y1, true);
trav(ans, matrix, x0 + 1, x1 - 1, y0, y0, true);
trav(ans, matrix, x0 + 1, x1 - 1, y0 + 1, y1 - 1, false);
}
}