Home >Backend Development >Python Tutorial >Python ideas and code examples for using iterators to print spiral matrices

Python ideas and code examples for using iterators to print spiral matrices

WBOY
WBOYOriginal
2016-07-22 08:56:351571browse

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) 

201672115457986.jpg (282×289)

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn