LeetCode54、59:螺旋矩阵|、||(递归,模拟)

 

 解题思路:定义一个方向数组,用栈或者直接从左上角的起点进行DFS,如果碰到下一步无法访问,调整方向,继续遍历,直到所有元素都访问了。

(这道题好有历史感,到现在还记得我读大一的时候参加院队培训的时候做的,当时还不会搜索,只会找规律,没想到找了好长时间的规律真让做对了,当时还是很兴奋。后来蓝桥杯好像也出现过一道类似的题目,那时候就没有再去找规律了,或许也是时间来不及,hhh,大一到研一,时间真的像是白驹过隙,自己也是越来越没有当初的敢打敢拼,思虑的东西也越来越多,希望自己能够拾回大一大二的那种意气风发的感觉,冲冲冲!)

 1 class Solution:
 2     def dfs(self,matrix,i,j,idx):
 3         self.vis[i][j]=1
 4         self.ans.append(matrix[i][j])
 5         for k in range(4):
 6             k = (idx+k)%4
 7             x = i+self.fx[k][0]
 8             y = j+self.fx[k][1]
 9             if 0<=x<self.n and 0<=y<self.m and not self.vis[x][y]:
10                 self.dfs(matrix,x,y,k)
11                 break
12         return
13     def spiralOrder(self, matrix):
14         self.fx = [[0,1],[1,0],[0,-1],[-1,0]]
15         self.vis = [[ 0 for j in range(len(matrix[i]))]for i in range(len(matrix))]
16         self.n,self.m = len(matrix),len(matrix[0])
17         self.ans = []
18         self.dfs(matrix,0,0,0)
19         return self.ans

螺旋矩阵||也是一样的解法。

 1 #没用的变量都没删
 2 class Solution:
 3     def dfs(self,val,i,j,idx):
 4         self.vis[i][j]=1
 5         self.matrix[i][j]=val
 6         val+=1
 7         for k in range(4):
 8             k = (idx+k)%4
 9             x = i+self.fx[k][0]
10             y = j+self.fx[k][1]
11             if 0<=x<self.n and 0<=y<self.m and not self.vis[x][y]:
12                 self.dfs(val,x,y,k)
13                 val+=1
14                 break
15         return
16     def generateMatrix(self, n):
17         self.matrix = [[0 for j in range(n) ] for i in range(n)]
18         self.fx = [[0,1],[1,0],[0,-1],[-1,0]]
19         self.vis = [[ 0 for j in range(n)]for i in range(n)]
20         self.n,self.m = n,n
21         self.dfs(1,0,0,0)
22         return self.matrix

 

posted @ 2021-03-15 13:06  ISGuXing  阅读(582)  评论(0编辑  收藏  举报