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获取脚本所在目录的正确方法
Apr 15 Python
举例介绍Python中的25个隐藏特性
Mar 30 Python
Python中对象迭代与反迭代的技巧总结
Sep 17 Python
python交互式图形编程实例(二)
Nov 17 Python
python3解析库pyquery的深入讲解
Jun 26 Python
Python设计模式之抽象工厂模式原理与用法详解
Jan 15 Python
10招!看骨灰级Pythoner玩转Python的方法
Apr 15 Python
Pytorch在dataloader类中设置shuffle的随机数种子方式
Jan 14 Python
.dcm格式文件软件读取及python处理详解
Jan 16 Python
django创建超级用户时指定添加其它字段方式
May 14 Python
python3.8.1+selenium实现登录滑块验证功能
May 22 Python
再谈python_tkinter弹出对话框创建
Mar 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
使用php实现快钱支付功能(涉及到接口)
2013/07/01 PHP
php遍历目录方法小结
2015/03/10 PHP
解决PHP程序运行时:Fatal error: Maximum execution time of 30 seconds exceeded in的错误提示
2016/11/25 PHP
详解PHP处理字符串类似indexof的方法函数
2017/06/11 PHP
php显示当前文件所在的文件以及文件夹所有文件以树形展开
2013/12/13 Javascript
node.js中的http.request.end方法使用说明
2014/12/10 Javascript
jQuery修改class属性和CSS样式整理
2015/01/30 Javascript
JavaScript获取当前网页标题(title)的方法
2015/04/03 Javascript
JS模式之简单的订阅者和发布者模式完整实例
2015/06/30 Javascript
详细分析JavaScript函数定义
2015/07/16 Javascript
jQuery实现折叠、展开的菜单组效果代码
2015/09/16 Javascript
JavaScript中instanceof运算符的使用示例
2016/06/08 Javascript
JS实现面向对象继承的5种方式分析
2018/07/21 Javascript
webpack4 + react 搭建多页面应用示例
2018/08/03 Javascript
webpack4 入门最简单的例子介绍
2018/09/05 Javascript
浅谈让你的代码更简短,更整洁,更易读的ES6小技巧
2018/10/25 Javascript
微信小程序封装自定义弹窗的实现代码
2019/05/08 Javascript
jquery中为什么能用$操作
2019/06/18 jQuery
Vue2.x和Vue3.x的双向绑定原理详解
2020/11/05 Javascript
在Django中创建动态视图的教程
2015/07/15 Python
python 用下标截取字符串的实例
2018/12/25 Python
11个Python3字典内置方法大全与示例汇总
2019/05/13 Python
python获取点击的坐标画图形的方法
2019/07/09 Python
python 数据生成excel导出(xlwt,wlsxwrite)代码实例
2019/08/23 Python
Python3从零开始搭建一个语音对话机器人的实现
2019/08/23 Python
Python面向对象程序设计之私有变量,私有方法原理与用法分析
2020/03/23 Python
手把手教你如何用Pycharm2020.1.1配置远程连接的详细步骤
2020/08/07 Python
Canvas制作旋转的太极的示例
2018/03/09 HTML / CSS
日本钓鱼渔具和户外用品网上商店:naturum
2016/08/07 全球购物
客服文员岗位职责
2013/11/29 职场文书
总经理司机岗位职责
2014/02/06 职场文书
初中生期末评语大全
2014/04/24 职场文书
小班评语大全
2014/05/04 职场文书
合伙经营协议书范本(通用版)
2014/12/03 职场文书
少年派的奇幻漂流观后感
2015/06/08 职场文书
2016年清明节网上祭英烈活动总结
2016/04/01 职场文书