classSolution(object):defspiralOrder(self,matrix):""" :type matrix: List[List[int]] :rtype: List[int] """begin=0m=len(matrix)-1ifm<0:return[]else:n=len(matrix[0])-1returnself.rotate(matrix,begin,m,n)#-------|#| |defrotate(self,l,start,end1,end2):# traversal each peering #|-------|r=[]ifstart<=end1andstart<=end2:# if x,y are within m,n# base stateifstart==end1andstart!=end2:# if a rectangle, the last several rows are remainforyinrange(start,end2+1):r.append(l[start][y])elifstart!=end1andstart==end2:# if a rectangle, the last several columns are remainforxinrange(start,end1+1):r.append(l[x][start])elifstart==end1andstart==end2:# if a cube, the last one central item is remainr.append(l[start][start])elifstart==end1+1andstart==end2+1:# if cube, the last 2*2 matrix is remainr=r+[l[start][start]]+[l[start][end1]]+[l[end1][start]]+[l[end1][end1]]else:foryinrange(start,end2+1):# if last row, traversal the columnr.append(l[start][y])forxinrange(start+1,end1+1):# if 2nd column, traversal the rowr.append(l[x][end2])foryinrange(end2-1,start-1,-1):# if 3rd row, traversal the columnr.append(l[end1][y])forxinrange(end1-1,start+1-1,-1):# if 4th column, traversal the rowr.append(l[x][start])r=r+self.rotate(l,start+1,end1-1,end2-1)# peering next inside layerreturnrelse:return[]if__name__=="__main__":answer=Solution()printanswer.spiralOrder([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])