新闻动态   News
搜索   Search
你的位置:首页 > 新闻动态 > 技术文档

飘逸的python - 打印螺旋矩阵

2013/8/22 15:10:30      点击:
算法分析:
螺旋矩阵用二维数组表示,坐标(x,y),即(x轴坐标,y轴坐标)
顺时针螺旋的方向是->右,下,左,上,用数值表示即是x加1格(1,0),y加1格(0,1),x减1格(-1,0),y减1格(0,-1)
坐标从(0,0)开始行走,当超出范围或遇到障碍时切换方向

经过上面的分析,思路很清晰了,千言不如一码。

[python] view plaincopy
  1. import itertools  
  2. def spiral(n,m):  
  3.     _status = itertools.cycle(['right','down','left','up'])#用于状态周期性的切换  
  4.     _movemap = {  
  5.         'right':(1,0),  
  6.         'down':(0,1),  
  7.         'left':(-1,0),  
  8.         'up':(0,-1),  
  9.     }  
  10.     pos2no = dict.fromkeys([(x,y) for x in range(n) for y in range(m)])  
  11.     _pos = (0,0)  
  12.     _st = next(_status)  
  13.     for i in range(1,n*m+1):  
  14.         _oldpos = _pos  
  15.         _pos = tuple(map(sum,zip(_pos,_movemap[_st])))#根据状态进行移动  
  16.         if (_pos not in pos2no) or (pos2no[_pos]):#当超出范围或遇到障碍时切换方向  
  17.             _st = next(_status)  
  18.             _pos = tuple(map(sum,zip(_oldpos,_movemap[_st])))  
  19.         pos2no[_oldpos] = i  
  20.     return pos2no  
  21.   
  22. def display_spiral(n,m):  
  23.     pos2no = spiral(n,m)  
  24.     for i in range(m):  
  25.         for j in range(n):  
  26.             print pos2no[(j,i)],'\t',  
  27.         print '\n'  
  28.     print '-'*30  
  29.   
  30. display_spiral(4,4)  
  31. display_spiral(5,4)