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音频处理用到的操作的示例代码
Oct 27 Python
Python序列循环移位的3种方法推荐
Apr 09 Python
Python3实现将本地JSON大数据文件写入MySQL数据库的方法
Jun 13 Python
python pygame模块编写飞机大战
Nov 20 Python
Python寻找两个有序数组的中位数实例详解
Dec 05 Python
浅谈python中get pass用法
Mar 19 Python
python使用原始套接字发送二层包(链路层帧)的方法
Jul 22 Python
利用 Flask 动态展示 Pyecharts 图表数据方法小结
Sep 04 Python
在keras中获取某一层上的feature map实例
Jan 24 Python
在keras 中获取张量 tensor 的维度大小实例
Jun 10 Python
PyCharm 2020.2.2 x64 下载并安装的详细教程
Oct 15 Python
pandas 数据类型转换的实现
Dec 29 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中将数组转成字符串并保存到数据库中的函数代码
2013/09/29 PHP
php图形jpgraph操作实例分析
2017/02/22 PHP
Javascript 陷阱 window全局对象
2008/11/26 Javascript
jQuery 插件仿百度搜索框智能提示(带Value值)
2013/01/22 Javascript
jQuery弹出框代码封装DialogHelper
2015/01/30 Javascript
后台获取ZTREE选中节点的方法
2015/02/12 Javascript
jQuery实现自定义右键菜单的树状菜单效果
2015/09/02 Javascript
js弹出对话框方式小结
2015/11/17 Javascript
微信小程序 less文件编译成wxss文件实现办法
2016/12/05 Javascript
js实现无缝滚动图(可控制当前滚动的方向)
2017/02/22 Javascript
JavaScript中在光标处插入添加文本标签节点的详细方法
2017/03/22 Javascript
基于Node.js模板引擎教程-jade速学与实战1
2017/09/17 Javascript
深入理解React高阶组件
2017/09/28 Javascript
浅谈Angularjs中不同类型的双向数据绑定
2018/07/16 Javascript
Vue框架里使用Swiper的方法示例
2018/09/20 Javascript
在vue中使用express-mock搭建mock服务的方法
2018/11/07 Javascript
vue 使用高德地图vue-amap组件过程解析
2019/09/07 Javascript
如何利用node转发请求详解
2020/09/17 Javascript
微信小程序使用前置摄像头拍照
2020/10/22 Javascript
[02:44]重置世界,颠覆未来——DOTA2 7.23版本震撼上线
2019/12/01 DOTA
[53:13]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第三场 1月18日
2021/03/11 DOTA
浅析Python的web.py框架中url的设定方法
2016/07/11 Python
浅谈Python爬取网页的编码处理
2016/11/04 Python
python getopt详解及简单实例
2016/12/30 Python
解决Scrapy安装错误:Microsoft Visual C++ 14.0 is required...
2017/10/01 Python
python队列queue模块详解
2018/04/27 Python
python使用PIL和matplotlib获取图片像素点并合并解析
2019/09/10 Python
python+pygame实现坦克大战
2019/09/10 Python
事业单位接收函
2014/01/10 职场文书
医院实习接收函
2014/01/12 职场文书
文明餐桌行动实施方案
2014/02/19 职场文书
经典公益广告词
2014/03/13 职场文书
高校自主招生校长推荐信
2015/03/23 职场文书
Win11 KB5015814遇安装失败 影响开始菜单性能解决方法
2022/07/15 数码科技
win10如何更改appdata文件夹的默认位置?
2022/07/15 数码科技
win10如何开启ahci模式?win10开启ahci模式详细操作教程
2022/07/23 数码科技