美文网首页
打印n阶螺旋矩阵

打印n阶螺旋矩阵

作者: droid_zf | 来源:发表于2019-04-26 09:53 被阅读0次

分析:
1.首先矩阵对应一个二维数组,所以我们要定义一个二维数组a
2.矩阵边长为l=n,最大值为l x l
3.填充数组a[x,y],确定起始位置,我选择从a[0,0]开始
4.填上边 a[0,0],a[0,1],a[0,2]...a[0,l-1] 每次y++
5.填右边 a[0,l-1],a[1,l-1]...a[l-1,l-1] 每次x++
6.填下边 a[l-1,l-2],a[l-1,l-3]...a[l-1,0] 每次y--
7.填左边 a[l-2,0],a[l-3,0]...a[0,1]每次x--
8.循环4、5、6、7,l x l个数全填完结束

从中心顺时针打印

func matrix(n int) {
    /*
      n=5
    从里向外顺时针打印                   坐标                         
    25  10  11  12  13              0,0  0,1  0,2  0,3  0,4    
    24   9   2   3  14              1,0  1,1  1,2  1,3  1,4    
    23   8   1   4  15              2,0  2,1  2,2  2,3  2,4    
    22   7   6   5  16              3,0  3,1  3,2  3,3  3,4    
    21  20  19  18  17              4,0  4,1  4,2  4,3  4,4   
    */
    l := n          //边长度
    num := l * l          //矩阵最大值
    a := make([][]int, l) //初始化二维数组
    for key := range a {
        a[key] = make([]int, l)
    }
    x := 0 //坐标0,0开始填充数组
    y := 0
    for num > 0 { //num递减填充到a,到1结束

        for x < l && a[x][y] == 0 { //填充左边,注意越界和填充完一圈后不要覆盖已填充的值
            a[x][y] = num
            x++
            num--
        }
        x-- //x==边长x自增了,需要减1
        y++ //左下角已填入,从y+1开始填充下边

        for y < l && a[x][y] == 0 { //填充下边
            a[x][y] = num
            y++
            num--
        }
        y--
        x--

        for 0 <= x && a[x][y] == 0 { //填充右边,填充到0结束
            a[x][y] = num
            x--
            num--
        }
        x++
        y--
        for 0 <= y && a[x][y] == 0 { //填充上边
            a[x][y] = num
            y--
            num--
        }
        y++
        x++
    }
    //打印结果
    for i := 0; i < len(a[0]); i++ {
        for j := 0; j < len(a[0]); j++ {
            fmt.Printf("%2d%s", a[i][j], "  ")
        }
        fmt.Println()
    }
    //打印坐标
    for i := 0; i < len(a[0]); i++ {
        for j := 0; j < len(a[0]); j++ {
            fmt.Printf("%d%s%d%s", i, ",", j, "  ")
        }
        fmt.Println()
    }

}

从左上角顺时针打印

func matrix(n int) {
    /*
      n=5
    从外向内顺时针打印               坐标                     
     1   2   3   4   5          0,0  0,1  0,2  0,3  0,4
    16  17  18  19   6          1,0  1,1  1,2  1,3  1,4
    15  24  25  20   7          2,0  2,1  2,2  2,3  2,4
    14  23  22  21   8          3,0  3,1  3,2  3,3  3,4
    13  12  11  10   9          4,0  4,1  4,2  4,3  4,4
    */
    l := n          //边长度
    num := 1              //矩阵初始值
    a := make([][]int, l) //初始化二维数组
    for key := range a {
        a[key] = make([]int, l)
    }
    x := 0 //坐标0,0开始填充数组
    y := 0
    for num <= l*l { //num递增填充到a,最大值l*l
        for y < l && a[x][y] == 0 { //填充上边
            a[x][y] = num
            y++
            num++
        }
        y--
        x++
        for x < l && a[x][y] == 0 { //填充右边
            a[x][y] = num
            x++
            num++
        }
        x--
        y--

        for 0 <= y && a[x][y] == 0 { //填充下边
            a[x][y] = num
            y--
            num++
        }
        y++
        x--

        for 0 <= x && a[x][y] == 0 { //填充左边
            a[x][y] = num
            x--
            num++
        }
        x++
        y++

    }
    //打印结果
    for i := 0; i < len(a[0]); i++ {
        for j := 0; j < len(a[0]); j++ {
            fmt.Printf("%2d%s", a[i][j], "  ")
        }
        fmt.Println()
    }
    //打印坐标
    for i := 0; i < len(a[0]); i++ {
        for j := 0; j < len(a[0]); j++ {
            fmt.Printf("%d%s%d%s", i, ",", j, "  ")
        }
        fmt.Println()
    }

}

相关文章

网友评论

      本文标题:打印n阶螺旋矩阵

      本文链接:https://www.haomeiwen.com/subject/jdixnqtx.html