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中__init__和__new__的区别详解
Jul 09 Python
利用Python学习RabbitMQ消息队列
Nov 30 Python
Python tkinter模块中类继承的三种方式分析
Aug 08 Python
Python利用ORM控制MongoDB(MongoEngine)的步骤全纪录
Sep 13 Python
Python根据成绩分析系统浅析
Feb 11 Python
python PyAutoGUI 模拟鼠标键盘操作和截屏功能
Aug 04 Python
Golang GBK转UTF-8的例子
Aug 26 Python
Python 网络编程之TCP客户端/服务端功能示例【基于socket套接字】
Oct 12 Python
FFT快速傅里叶变换的python实现过程解析
Oct 21 Python
python关闭占用端口方式
Dec 17 Python
python 多进程队列数据处理详解
Dec 23 Python
Python线程条件变量Condition原理解析
Jan 20 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
虫族 ZERG 概述
2020/03/14 星际争霸
关于Intype一些小问题的解决办法
2008/03/28 PHP
PHP-MySQL教程归纳总结
2008/06/07 PHP
php读取xml实例代码
2010/01/28 PHP
PHP 事务处理数据实现代码
2010/05/13 PHP
解决php写入数据库乱码的问题
2019/09/17 PHP
js 无提示关闭浏览器页面的代码
2010/03/09 Javascript
使用js操作cookie的一点小收获分享
2013/09/03 Javascript
基于JavaScript实现移动端TAB触屏切换效果
2015/10/20 Javascript
理解JavaScript原型链
2016/10/25 Javascript
js自定义QQ菜单效果
2017/01/10 Javascript
jQuery插件echarts实现的单折线图效果示例【附demo源码下载】
2017/03/04 Javascript
几种响应式文字详解
2017/05/19 Javascript
JS HTML图片显示Canvas 压缩功能
2017/07/21 Javascript
详解AngularJS跨页面传值(ui-router)
2017/08/23 Javascript
Vue使用vux-ui自定义表单验证遇到的问题及解决方法
2018/05/10 Javascript
vue插件draggable实现拖拽移动图片顺序
2018/12/01 Javascript
vue+iview 兼容IE11浏览器的实现方法
2019/01/07 Javascript
React实现轮播效果
2020/08/25 Javascript
原生JS实现九宫格抽奖
2020/09/13 Javascript
[04:10]DOTA2英雄梦之声_第11期_圣堂刺客
2014/06/21 DOTA
[01:44]Ti10举办地公布
2019/08/25 DOTA
python进阶教程之模块(module)介绍
2014/08/30 Python
Python卸载模块的方法汇总
2016/06/07 Python
Python中判断输入是否为数字的实现代码
2018/05/26 Python
在tensorflow中实现屏蔽输出的log信息
2020/02/04 Python
python 函数中的参数类型
2020/02/11 Python
Python matplotlib读取excel数据并用for循环画多个子图subplot操作
2020/07/14 Python
I.T中国官网:精选时尚设计师单品网购平台
2018/03/26 全球购物
德国传统玻璃制造商:Cristalica
2018/04/23 全球购物
西班牙香水和化妆品购物网站:Arenal Perfumerías
2019/03/01 全球购物
美国木工工具和用品商店:Woodcraft
2019/10/30 全球购物
生日主持词
2014/03/20 职场文书
大学学生会竞选演讲稿
2014/04/25 职场文书
爱国主义电影观后感
2015/06/18 职场文书
小学体育组工作总结
2015/08/13 职场文书