题目
给你一个正整数 n
,生成一个包含 1
到 n^2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
示例 1:

1 2
| 输入:n = 3 输出:[[1,2,3],[8,9,4],[7,6,5]]
|
示例 2:
提示:
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/spiral-matrix-ii
思路

如图我们定义左上角的坐标为 0,0
,横轴为 x
轴;竖轴为 y
轴。
即 matrix[1]
的下标为 y-1
;值分别为 {y-1,x-1}...
而我们要控制的就是起始点 1,1
开始按 右下左上 的循环逻辑去移动即可,并且保证点在合理的区域内。
代码
Go
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| package main
import "fmt"
type point struct { x int y int }
func generateMatrix(n int) [][]int { matrix := make([][]int, n)
for i := 0; i < n; i++ { matrix[i] = make([]int, n) }
p := point{1, 1} dir := "r" p_max := n p_min := 1
for i := 1; i <= n*n; i++ { fmt.Println(p) matrix[p.y-1][p.x-1] = i
switch dir { case "r": p.x += 1 break case "d": p.y += 1 break case "l": p.x -= 1 break case "t": p.y -= 1 break }
if dir == "r" && p.x == p_max { dir = "d" } if dir == "d" && p.y == p_max { dir = "l" p_max -= 1 } if dir == "l" && p.x == p_min { dir = "t" p_min += 1 } if dir == "t" && p.y == p_min { dir = "r" } }
return matrix }
func main() { fmt.Println(generateMatrix(2)) fmt.Println(generateMatrix(3)) fmt.Println(generateMatrix(4)) }
|