Thoughts
A spiral matrix refers to a matrix in a spiral shape. Its numbers continue to get larger from the first row to the right and downwards,
It gets bigger to the left, gets bigger up, and so on.
The spiral matrix is represented by a two-dimensional array, with coordinates (x, y), that is (x-axis coordinate, y-axis coordinate).
The direction of the clockwise spiral is ->right, down, left, and up. The numerical expression is x plus 1 grid (1,0), y plus 1 grid (0,1), x minus 1 grid (-1, 0), y minus 1 grid (0,-1).
The coordinates start walking from (0,0), and switch directions when out of range or encountering obstacles.
To print a spiral matrix, you first need to assign a value to the n*n array. According to the rules, it can be seen that each layer is incremented in the order of right->bottom->left->top. Therefore, as long as you find The first number of each layer is enough. The first value is the first number of the previous layer + 4*n-4. During the loop, n decreases by 2 each time.
Code
After the above analysis, the idea is very clear, a thousand words are not worth a code:
import itertools def spiral(n,m): _status = itertools.cycle(['right','down','left','up'])#用于状态周期性的切换 _movemap = { 'right':(1,0), 'down':(0,1), 'left':(-1,0), 'up':(0,-1), } pos2no = dict.fromkeys([(x,y) for x in range(n) for y in range(m)]) _pos = (0,0) _st = next(_status) for i in range(1,n*m+1): _oldpos = _pos _pos = tuple(map(sum,zip(_pos,_movemap[_st])))#根据状态进行移动 if (_pos not in pos2no) or (pos2no[_pos]):#当超出范围或遇到障碍时切换方向 _st = next(_status) _pos = tuple(map(sum,zip(_oldpos,_movemap[_st]))) pos2no[_oldpos] = i return pos2no def display_spiral(n,m): pos2no = spiral(n,m) for i in range(m): for j in range(n): print pos2no[(j,i)],'\t', print '\n' print '-'*30 display_spiral(4,4) display_spiral(5,4)