package main

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 * 
 * @param matrix int整型二维数组 
 * @return int整型一维数组
*/
func printMatrix( matrix [][]int ) []int {
    // write code here
    // 特殊条件排除
    if len(matrix) == 0 {
        return nil  
    }
    
    m, n := len(matrix), len(matrix[0])
    ans := make([]int, m * n)
    // 结果切片起始索引
    index := 0

    // 利用边界收缩
    left, right, up, down := 0, n-1, 0, m-1

    for left <= right && up <= down {
        // 从左往右打印
        for i := left; i <= right; i++ {
            ans[index] = matrix[up][i]
            index++
        }
        // 上面一行打印完了,上边界收缩
        if up = up + 1; up > down {
            break
        }

        // 从上往下打印
        for i := up; i <= down; i++ {
            ans[index] = matrix[i][right]
            index++
        }

        // 右侧一列打印完了,右边界收缩
        if right = right-1; right < left {
            break
        }

        // 从右向左打印
        for i := right; i >= left; i-- {
            ans[index] = matrix[down][i]
            index++
        }

        // 下面一行打印完毕,下边界收缩
        if down = down-1; down < up {
            break
        }

        // 从下往上打印
        for i := down; i >= up; i-- {
            ans[index] = matrix[i][left]
            index++
        }

        // 左边一列打印完毕,左边界收缩
        if left = left+1; left > right {
            break
        }
    }

    return ans
}

分圈进行打印,第一次循环,打印最外圈,分别收缩上、右、下、左边界,直至边界收缩到不合法时结束迭代,所以元素都已经加入到结果切片中了。