# 59. Spiral Matrix II 螺旋矩阵 II

@TOC

## # 题目描述

Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order.

``````For example,
Given n = 3,

You should return the following matrix:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
``````

## # 解题方法

### # 维护四个边界和运动方向

python代码如下，核心是每次遇到新的边界时，顺时针修改移动方向，并且将老边界内移。

### # 保存已经走过的位置

``````class Solution(object):
def generateMatrix(self, n):
"""
:type n: int
:rtype: List[List[int]]
"""
visited = [[0] * n for _ in range(n)]
matrix = [[0] * n for _ in range(n)]
self.row, self.col = 0, 0
self.curr = 1
def spiral():
move = False
while self.col < n and not visited[self.row][self.col]:
matrix[self.row][self.col] = self.curr
self.curr += 1
visited[self.row][self.col] = 1
self.col += 1
move = True
self.col -= 1
self.row += 1
while self.row < n and not visited[self.row][self.col]:
matrix[self.row][self.col] = self.curr
self.curr += 1
visited[self.row][self.col] = 1
self.row += 1
move = True
self.row -= 1
self.col -= 1
while self.col >= 0  and not visited[self.row][self.col]:
matrix[self.row][self.col] = self.curr
self.curr += 1
visited[self.row][self.col] = 1
self.col -= 1
move = True
self.col += 1
self.row -= 1
while self.row >= 0 and not visited[self.row][self.col]:
matrix[self.row][self.col] = self.curr
self.curr += 1
visited[self.row][self.col] = 1
self.row -= 1
move = True
self.row += 1
self.col += 1
if move:
spiral()
spiral()
return matrix
``````

## # 日期

2018 年 3 月 13 日 2019 年 9 月 13 日 —— 一年半后的做法明显变得简单了~