旋转生成矩阵(Spiral Matrix)
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 ]]
与之前蛇形遍历一个思路,给定几个状态x,y,state(说明当前生成的方向)
在这个问题中,只有以下几种情况:向上生成到顶时,向右生成;向右生成到顶时,向下生成;向下生成到顶时,向左生成;向左生成到顶时,向上生成。最终的结束条件是生成了n^2个数字。
首先生成一个n*n的矩阵:
1 | rs = [] |
这样就得到了一个n*n的空矩阵。
开始时尝试过
1 | [[None]*n]*n |
与
1 | [[None for i in range(n)]]*n |
的方式,发现均会出现问题。原因是以这种方式生成的二维数组的子项指向的是同一个对象。其后果是
1 | None]*5]*5 a = [[ |
使用built-in查看它们的id发现:
1 | id(a[2]),id(a[3]) |
因此放弃看上去简洁的写法。
更新:发现一个简洁有效的写法:
1 | x = [[None for i in range(n)] for j in range(n)] |
之后找出每个方向的条件
1 | while step <= n**2: |
大意如此。其中layer为当前从外向内已生成完的层数,由
1 | if step == n**2-(n-layer*2-2)**2:layer+=1 |
可以得到。