剑指Offer 29. 顺时针打印矩阵

发布时间 2023-08-27 19:44:21作者: 小星code

题目链接: 剑指Offer 29. 顺时针打印矩阵

题目描述:

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。

解法思路:

本题的题意比较简单,也就是螺旋打印矩阵,但是这里面有技巧,

  1. 使用 数组 定义好在打印过程中的四个移动方向
  2. 在遍历的过程中,每次都是在该方向上移动,
  3. 当移动到下一个点时,要判断这个下一个点是否合法(也就是之前访问过没,判断越界没)
  4. 如果访问过或越界,那么调整方向,换下一个方向执行
  5. 最后更新x,y的值。
    代码:
func spiralOrder(matrix [][]int) []int {

    n := len(matrix)
     if n == 0 {
         return nil
    } 
    m := len(matrix[0])
    dx := [4]int{0,1,0,-1}  //右、下、左、上
    dy := [4]int{1,0,-1,0}
    
    // res := make([]int,n*m)
    var res []int
   
    use := make([][]bool,n)
    for i:= 0 ;i<n;i++{
        use[i] = make([]bool,m)
    }

    x := 0 
    y := 0
    d := 0
    for i := 0 ; i < n*m ;i++{
        res = append(res,matrix[x][y])
        use[x][y] = true
        a := x + dx[d]
        b := y + dy[d]
        if a < 0 || a >= n || b < 0 ||b >= m ||use[a][b] == true{
            d = (d+1)%4
            a = x + dx[d]
            b = y + dy[d]
        }
        
    x = a
    y = b
    }
    return res
}