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通过imaplib模块读取gmail里邮件的方法
May 08 Python
Python处理Excel文件实例代码
Jun 20 Python
Python实现曲线点抽稀算法的示例
Oct 12 Python
解决Python print输出不换行没空格的问题
Nov 14 Python
Python交互式图形编程的实现
Jul 25 Python
django admin.py 外键,反向查询的实例
Jul 26 Python
pytorch 改变tensor尺寸的实现
Jan 03 Python
利用Tensorboard绘制网络识别准确率和loss曲线实例
Feb 15 Python
python GUI库图形界面开发之PyQt5信号与槽基本操作
Feb 25 Python
细数nn.BCELoss与nn.CrossEntropyLoss的区别
Feb 29 Python
python opencv实现图片缺陷检测(讲解直方图以及相关系数对比法)
Apr 07 Python
基于django micro搭建网站实现加水印功能
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中的extract的作用分析
2008/04/09 PHP
PHP命令行脚本接收传入参数的三种方式
2014/08/20 PHP
基于PHP实现等比压缩图片大小
2016/03/04 PHP
php服务器的系统详解
2019/10/12 PHP
PHP上传图片到数据库并显示的实例代码
2019/12/20 PHP
JavaScript DOM学习第四章 getElementByTagNames
2010/02/19 Javascript
Jquery获取复选框被选中值的简单方法
2013/07/04 Javascript
js计算字符串长度包含的中文是utf8格式
2013/10/15 Javascript
javascript数组去重方法汇总
2015/04/23 Javascript
JavaScript生成福利彩票双色球号码
2015/05/15 Javascript
javascript实现跨域的方法汇总
2015/06/25 Javascript
JavaScript操作URL的相关内容集锦
2015/10/29 Javascript
解决JS无法调用Controller问题的方法
2015/12/31 Javascript
纯JavaScript基于notie.js插件实现消息提示特效
2016/01/18 Javascript
AngularJS  ng-table插件设置排序
2016/09/21 Javascript
常用JS图片滚动(无缝、平滑、上下左右滚动)代码大全(推荐)
2016/12/20 Javascript
详细分析JS函数去抖和节流
2017/12/05 Javascript
vue和webpack安装命令详解
2018/06/15 Javascript
使用proxy实现一个更优雅的vue【推荐】
2018/06/19 Javascript
详解如何解决vue开发请求数据跨域的问题(基于浏览器的配置解决)
2018/11/12 Javascript
vue favicon设置以及动态修改favicon的方法
2018/12/21 Javascript
关于ligerui子页面关闭后,父页面刷新,重新加载的方法
2019/09/27 Javascript
Python学习pygal绘制线图代码分享
2017/12/09 Python
python Flask 装饰器顺序问题解决
2018/08/08 Python
Python grequests模块使用场景及代码实例
2020/08/10 Python
Python字符串查找基本操作代码案例
2020/10/27 Python
Python tkinter之Bind(绑定事件)的使用示例
2021/02/05 Python
详解Css3新特性应用之过渡与动画
2017/01/10 HTML / CSS
CSS3 清除浮动的方法示例
2018/06/01 HTML / CSS
英文版网络工程师求职信
2013/10/28 职场文书
校园网站的创业计划书范文
2013/12/30 职场文书
班级德育工作实施方案
2014/02/21 职场文书
学生逃课检讨书1000字
2014/10/20 职场文书
严以修身专题学习研讨会发言材料
2015/11/09 职场文书
MySql数据库 查询时间序列间隔
2022/05/11 MySQL
Hive HQL支持2种查询语句风格
2022/06/25 数据库