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 爬虫学习笔记之正则表达式
Sep 21 Python
Python实现感知器模型、两层神经网络
Dec 19 Python
Python中static相关知识小结
Jan 02 Python
详解将Django部署到Centos7全攻略
Sep 26 Python
在Python中实现shuffle给列表洗牌
Nov 08 Python
python3.4 将16进制转成字符串的实例
Jun 12 Python
使用OpCode绕过Python沙箱的方法详解
Sep 03 Python
wxpython+pymysql实现用户登陆功能
Nov 19 Python
实现Python与STM32通信方式
Dec 18 Python
python等差数列求和公式前 100 项的和实例
Feb 25 Python
Python列表解析操作实例总结
Feb 26 Python
解决tensorflow/keras时出现数组维度不匹配问题
Jun 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+Ajax异步通讯实现用户名邮箱验证是否已注册( 2种方法实现)
2011/12/28 PHP
php采用file_get_contents代替使用curl实例
2014/11/07 PHP
php for 循环使用的简单实例
2016/06/02 PHP
PHP页面输出时js设置input框的选中值
2016/09/30 PHP
Thinkphp通过一个入口文件如何区分移动端和PC端
2017/04/18 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
2017/11/10 PHP
Laravel 在views中加载公共页面的实现代码
2019/10/22 PHP
CSS+Jquery实现页面圆角框方法大全
2009/12/24 Javascript
js弹出层之1:JQuery.Boxy (二)
2011/10/06 Javascript
JScript分割字符串示例代码
2013/09/04 Javascript
js形成页面的一种遮罩效果实例代码
2014/01/04 Javascript
jQuery中parentsUntil()方法用法实例
2015/01/07 Javascript
javascript中一些util方法汇总
2015/06/10 Javascript
利用JS实现简单的日期选择插件
2017/01/23 Javascript
JS动态添加元素及绑定事件造成程序重复执行解决
2017/12/07 Javascript
详解基于React.js和Node.js的SSR实现方案
2019/03/21 Javascript
关于NodeJS中的循环引用详解
2019/07/23 NodeJs
原生js实现无缝轮播图
2020/01/11 Javascript
解决vue无法侦听数组及对象属性的变化问题
2020/07/17 Javascript
python中xrange和range的区别
2014/05/13 Python
Python实现微信公众平台自定义菜单实例
2015/03/20 Python
Django基础知识与基本应用入门教程
2018/07/20 Python
pycharm: 恢复(reset) 误删文件的方法
2018/10/22 Python
解决pyinstaller打包exe文件出现命令窗口一闪而过的问题
2018/10/31 Python
对Xpath 获取子标签下所有文本的方法详解
2019/01/02 Python
python自定义线程池控制线程数量的示例
2019/02/22 Python
python Matplotlib底图中鼠标滑过显示隐藏内容的实例代码
2019/07/31 Python
HTML5+CSS3 实现灵动的动画 TAB 切换效果(DEMO)
2017/09/15 HTML / CSS
意大利时尚精品店:Nugnes 1920
2020/02/10 全球购物
总经理助理岗位职责
2013/11/08 职场文书
体育教育专业毕业生自荐信
2013/11/15 职场文书
2014年科研工作总结
2014/12/03 职场文书
2015年党风廉政建设责任书
2015/01/29 职场文书
2015大学生入党个人自传
2015/06/26 职场文书
html+css实现分层金字塔的实例
2021/06/02 HTML / CSS
python中对列表的删除和添加方法详解
2022/02/24 Python