Python使用迭代器打印螺旋矩阵的思路及代码示例


Posted in Python onJuly 02, 2016

思路

螺旋矩阵是指一个呈螺旋状的矩阵,它的数字由第一行开始到右边不断变大,向下变大,
向左变大,向上变大,如此循环。
螺旋矩阵用二维数组表示,坐标(x,y),即(x轴坐标,y轴坐标)。
顺时针螺旋的方向是->右,下,左,上,用数值表示即是x加1格(1,0),y加1格(0,1),x减1格(-1,0),y减1格(0,-1)。
坐标从(0,0)开始行走,当超出范围或遇到障碍时切换方向。
螺旋矩阵的打印首先要对n*n的数组进行赋值,根据规律可以看出,每一层都是按照右->下->左->上的顺序进行递增,因此,只要找出每一层的第一个数即可,第一个数值为上一层的第一个数+4*n-4,循环时n每次减2。

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

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)

Python使用迭代器打印螺旋矩阵的思路及代码示例

Python 相关文章推荐
Python制作爬虫抓取美女图
Jan 20 Python
Bottle框架中的装饰器类和描述符应用详解
Oct 28 Python
Python验证文件是否可读写代码分享
Dec 11 Python
在Python中append以及extend返回None的例子
Jul 20 Python
django-利用session机制实现唯一登录的例子
Mar 16 Python
TensorFLow 数学运算的示例代码
Apr 21 Python
浅谈python 调用open()打开文件时路径出错的原因
Jun 05 Python
python怎么判断素数
Jul 01 Python
PyCharm 2020.2 安装详细教程
Sep 25 Python
Python中的None与 NULL(即空字符)的区别详解
Sep 24 Python
解决Python import .pyd 可能遇到路径的问题
Mar 04 Python
python tkinter Entry控件的焦点移动操作
May 22 Python
Python使用ntplib库同步校准当地时间的方法
Jul 02 #Python
Python编程中对super函数的正确理解和用法解析
Jul 02 #Python
Python中的复制操作及copy模块中的浅拷贝与深拷贝方法
Jul 02 #Python
快速排序的算法思想及Python版快速排序的实现示例
Jul 02 #Python
Python使用functools模块中的partial函数生成偏函数
Jul 02 #Python
Python之父谈Python的未来形式
Jul 01 #Python
举例讲解Python的lambda语句声明匿名函数的用法
Jul 01 #Python
You might like
PHP简单实现冒泡排序的方法
2016/12/26 PHP
php的单例模式及应用场景详解
2021/02/27 PHP
CheckBox 如何实现全选?
2006/06/23 Javascript
Mootools 图片展示插件(lightbox,ImageMenu)收集集合
2010/05/21 Javascript
JavaScript Accessor实现说明
2010/12/06 Javascript
Jquery右下角抖动、浮动 实例代码(兼容ie6、FF)
2013/08/15 Javascript
javascript使用switch case实现动态改变超级链接文字及地址
2014/12/16 Javascript
jQuery实现checkbox全选的方法
2015/06/10 Javascript
纯javascript实现分页(两种方法)
2015/08/26 Javascript
jquery+CSS3模拟Path2.0动画菜单效果代码
2015/08/31 Javascript
纯js代码实现简单计算器
2015/12/02 Javascript
JQuery的常用选择器、过滤器、方法全面介绍
2016/05/25 Javascript
jQuery+PHP实现微信转盘抽奖功能的方法
2016/05/25 Javascript
js事件冒泡与事件捕获详解
2017/02/20 Javascript
Angular2利用组件与指令实现图片轮播组件
2017/03/27 Javascript
vue better-scroll插件使用详解
2018/01/25 Javascript
详解给Vue2路由导航钩子和axios拦截器做个封装
2018/04/10 Javascript
JavaScript数据结构与算法之二叉树添加/删除节点操作示例
2019/03/01 Javascript
[45:18]2018DOTA2亚洲邀请赛 4.3 突围赛 Optic vs iG 第一场
2018/04/04 DOTA
[44:40]Spirit vs Navi Supermajor小组赛 A组败者组第一轮 BO3 第一场 6.2
2018/06/03 DOTA
python爬虫URL重试机制的实现方法(python2.7以及python3.5)
2018/12/18 Python
Python实现的IP端口扫描工具类示例
2019/02/15 Python
python中时间转换datetime和pd.to_datetime详析
2019/08/11 Python
Html5移动端适配IphoneX等机型的方法
2019/06/25 HTML / CSS
工程造价专业大专生求职信
2013/10/06 职场文书
视光学专业毕业生推荐信
2013/10/28 职场文书
会计岗位职责
2013/11/08 职场文书
个人课题方案
2014/05/08 职场文书
2015年社区卫生工作总结
2015/04/21 职场文书
送达通知书
2015/04/25 职场文书
建党伟业观后感
2015/06/01 职场文书
居住证明范文
2015/06/17 职场文书
外出培训学习心得体会
2016/01/18 职场文书
Python的这些库,你知道多少?
2021/06/09 Python
Mysql数据库值的添加、修改、删除及清空操作实例
2021/06/20 MySQL
Python+OpenCV实现在图像上绘制矩形
2022/03/21 Python