import java.util.*;

public class Solution {
    public ArrayList<Integer> spiralOrder(int[][] matrix) {
        // 右下左上四个方向 
        int[] dx = {0, 1, 0, -1};
        int[] dy = {1, 0, -1, 0};
        ArrayList<Integer> list = new ArrayList<>();
        if (matrix == null || matrix.length == 0) return new ArrayList<>();
        int n = matrix.length, m = matrix[0].length;
        int x = 0, y = 0, d = 0;
        boolean[][] vis = new boolean[15][15];
        // 使用数的个数作为循环的依据
        for (int i = 1; i <= n * m; i++) {
            list.add(matrix[x][y]);
            vis[x][y] = true;
            int tx = x + dx[d], ty = y + dy[d];
            // 是否越界或是否已经读取过
            if (tx < 0 || tx >= n || ty < 0 || ty >= m || vis[tx][ty]) {
                d = (d + 1) % 4;
                tx = x + dx[d];
                ty = y + dy[d];
            }
            x = tx;
            y = ty;
        }
        return list;
    }
}