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);
    }
}