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中删除文件的程序代码
Mar 13 Python
python实现提取百度搜索结果的方法
May 19 Python
Python和C/C++交互的几种方法总结
May 11 Python
用virtualenv建立多个Python独立虚拟开发环境
Jul 06 Python
python实现八大排序算法(2)
Sep 14 Python
Python实现一个简单的验证码程序
Nov 03 Python
TensorFlow实现模型评估
Sep 07 Python
python获取url的返回信息方法
Dec 17 Python
在Python运行时动态查看进程内部信息的方法
Feb 22 Python
Python的log日志功能及设置方法
Jul 11 Python
解析Tensorflow之MNIST的使用
Jun 30 Python
python使用PySimpleGUI设置进度条及控件使用
Jun 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实现的简易扫雷游戏实例
2015/07/09 PHP
[原创]php token使用与验证示例【测试可用】
2017/08/30 PHP
laravel框架select2多选插件初始化默认选中项操作示例
2020/02/18 PHP
JSON 编辑器实现代码
2009/12/06 Javascript
JS代码放在head和body中的区别分析
2011/12/01 Javascript
JQuery实现倒计时按钮的实现代码
2012/03/23 Javascript
jQuery封装的获取Url中的Get参数示例
2013/11/26 Javascript
javascript实现行拖动的方法
2015/05/27 Javascript
JS+CSS实现TreeMenu二级树形菜单完整实例
2015/09/18 Javascript
vue+axios实现登录拦截的实例代码
2017/05/22 Javascript
mac下的nodejs环境安装的步骤
2017/05/24 NodeJs
深入浅析JSONAPI在PHP中的应用
2017/12/24 Javascript
使用Angular CLI进行单元测试和E2E测试的方法
2018/03/24 Javascript
create-react-app修改为多页面支持的方法
2018/05/17 Javascript
浅谈Webpack核心模块tapable解析
2018/09/11 Javascript
移动端图片上传旋转、压缩问题的方法
2018/10/16 Javascript
JS函数节流和防抖之间的区分和实现详解
2019/01/11 Javascript
使用express获取微信小程序二维码小记
2019/05/21 Javascript
解决VUEX的mapState/...mapState等取值问题
2020/07/24 Javascript
Python多线程学习资料
2012/12/19 Python
django自带的server 让外网主机访问方法
2018/05/14 Python
python中使用iterrows()对dataframe进行遍历的实例
2018/06/09 Python
python利用requests库模拟post请求时json的使用教程
2018/12/07 Python
PyQt5+Caffe+Opencv搭建人脸识别登录界面
2019/08/28 Python
Python3和PyCharm安装与环境配置【图文教程】
2020/02/14 Python
基于python爬取梨视频实现过程解析
2020/11/09 Python
Python爬虫自动化获取华图和粉笔网站的错题(推荐)
2021/01/08 Python
利用CSS3伪元素实现逐渐发光的方格边框
2017/05/07 HTML / CSS
使用CSS3制作一个简单的进度条(demo)
2017/05/23 HTML / CSS
入党自我鉴定范文
2013/10/04 职场文书
酒店实习个人鉴定
2013/12/07 职场文书
学习雷锋精神心得体会范文
2014/03/12 职场文书
青年教师师德演讲稿
2014/08/26 职场文书
海上钢琴师的观后感
2015/06/11 职场文书
2015年清剿火患专项行动工作总结
2015/07/27 职场文书
2019年幼儿园管理条例范本!
2019/07/17 职场文书