/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param matrix int整型二维数组
 * @return int整型一维数组
 */
function spiralOrder(matrix) {
    // write code here
    let ans = [];
    let m = matrix.length;
    if (m == 0) {
        return ans;
    }
    let n = matrix[0].length;
    let v = new Array(m + 1).fill(0).map((x) => (x = new Array(n + 1).fill(0)));
    // 边界标记
    for (let i = 0; i < m + 1; i++) {
        v[i][n] = 1;
    }
    // 边界标记
    for (let i = 0; i < n + 1; i++) {
        v[m][i] = 1;
    }
    // 偏移数组
    let xx = [0, 1, 0, -1],
        yy = [1, 0, -1, 0];
    // 初始化数据
    let i = 0,
        j = 0,
        mod = 0,
        cnt = m * n;
    function check(x, y) {
        // 判断边界和是否已经标记
        if (x < 0 || y < 0 || x >= m || y >= n || v[x][y] == 1) {
            return false;
        }
        return true;
    }
    // 当计数大于0
    while (cnt > 0) {
        // 检查当前坐标
        while (check(i, j)) {
            // 添加倒答案数组
            ans.push(matrix[i][j]);
            // 标记
            v[i][j] = 1;
            // 减少计数
            cnt--;
            // 坐标偏移
            i += xx[mod];
            j += yy[mod];
        }
        // 因为跳出循环的时候已经偏移了,所以要返回上一状态
        i -= xx[mod];
        j -= yy[mod];
        mod = (mod + 1) % 4;
        // 偏移倒下一状态
        i += xx[mod];
        j += yy[mod];
    }
    return ans;
}
module.exports = {
    spiralOrder: spiralOrder,
};