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深入学习之对象的属性
Aug 31 Python
Python实现备份MySQL数据库的方法示例
Jan 11 Python
python编程测试电脑开启最大线程数实例代码
Feb 09 Python
基于Python中求和函数sum的用法详解
Jun 28 Python
Python动态生成多维数组的方法示例
Aug 09 Python
Python运维开发之psutil库的使用详解
Oct 18 Python
在python中使用with打开多个文件的方法
Jan 07 Python
Opencv-Python图像透视变换cv2.warpPerspective的示例
Apr 11 Python
Pytorch中实现只导入部分模型参数的方式
Jan 02 Python
打印tensorflow恢复模型中所有变量与操作节点方式
May 26 Python
Python持续监听文件变化代码实例
Jul 22 Python
Python 必须了解的5种高级特征
Sep 10 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中通过ADODB库实现调用Access数据库之修正版本
2006/12/31 PHP
PHP集成FCK的函数代码
2008/09/27 PHP
php中模拟POST传递数据的两种方法分享
2011/09/16 PHP
详谈php ip2long 出现负数的原因及解决方法
2017/04/05 PHP
php实现的pdo公共类定义与用法示例
2017/07/19 PHP
PHP设计模式之装饰器(装饰者)模式(Decorator)入门与应用详解
2019/12/13 PHP
超级酷和最实用的jQuery实例收集(20个)
2010/04/21 Javascript
node.js中的http.createServer方法使用说明
2014/12/14 Javascript
jQuery中get()方法用法实例
2014/12/27 Javascript
JavaScript是如何实现继承的(六种方式)
2016/03/31 Javascript
微信小程序 navigation API实例详解
2016/10/02 Javascript
IE8兼容Jquery.validate.js的问题
2016/12/01 Javascript
node vue项目开发之前后端分离实战记录
2017/12/13 Javascript
vue如何解决循环引用组件报错的问题
2018/09/22 Javascript
js数组去重的方法总结
2019/01/18 Javascript
vue指令v-html使用过滤器filters功能实例
2019/10/25 Javascript
解决React在安装antd之后出现的Can't resolve './locale'问题(推荐)
2020/05/03 Javascript
[34:39]Secret vs VG 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
python检测服务器是否正常
2014/02/16 Python
python使用Flask框架获取用户IP地址的方法
2015/03/21 Python
Python2实现的LED大数字显示效果示例
2017/09/04 Python
Django-Rest-Framework 权限管理源码浅析(小结)
2018/11/12 Python
Python之使用adb shell命令启动应用的方法详解
2019/01/07 Python
Django配置文件代码说明
2019/12/04 Python
Python pymsql模块的使用
2020/09/07 Python
用CSS3写的模仿iPhone中的返回按钮
2015/04/04 HTML / CSS
彪马法国官网:PUMA法国
2019/12/15 全球购物
成功经营餐厅的创业计划书范文
2013/12/26 职场文书
试用期员工考核制度
2014/01/22 职场文书
触电现场处置方案
2014/05/14 职场文书
职业生涯规划书怎么写?
2014/09/14 职场文书
教师群众路线教育实践活动学习笔记
2014/11/05 职场文书
2014年技术工作总结范文
2014/11/20 职场文书
专家推荐信怎么写
2015/03/25 职场文书
2015年法制宣传月活动总结
2015/03/26 职场文书
2019学子的答谢词范本!
2019/07/05 职场文书