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网络爬虫采集联想词示例
Feb 11 Python
Python实现的几个常用排序算法实例
Jun 16 Python
python字符串,数值计算
Oct 05 Python
python3.4用函数操作mysql5.7数据库
Jun 23 Python
python实现对输入的密文加密
Mar 20 Python
解决pyqt5中QToolButton无法使用的问题
Jun 21 Python
Python计算一个点到所有点的欧式距离实现方法
Jul 04 Python
Python使用tkinter模块实现推箱子游戏
Oct 08 Python
关于windows下Tensorflow和pytorch安装教程
Feb 04 Python
安装完Python包然后找不到模块的解决步骤
Feb 13 Python
python 如何使用find和find_all爬虫、找文本的实现
Oct 16 Python
python利用 keyboard 库记录键盘事件
Oct 16 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
解决MySQL中文输出变成问号的问题
2008/06/05 PHP
提高PHP编程效率 引入缓存机制提升性能
2010/02/15 PHP
php.ini 配置文件的深入解析
2013/06/17 PHP
Laravel Eloquent ORM 实现查询表中指定的字段
2019/10/17 PHP
使用jquery实现select添加实现后台权限添加的效果
2011/05/28 Javascript
ASP.NET jQuery 实例15 通过控件CustomValidator验证CheckBoxList
2012/02/03 Javascript
JS 获取浏览器和屏幕宽高等信息的实现思路及代码
2013/07/31 Javascript
jquery制作select列表双向选择示例代码
2014/09/02 Javascript
JS+DIV+CSS实现的经典标签切换效果代码
2015/09/14 Javascript
jQuery弹簧插件编写基础之“又见弹窗”
2015/12/11 Javascript
浏览器环境下JavaScript脚本加载与执行探析之动态脚本与Ajax脚本注入
2016/01/19 Javascript
基于jquery实现三级下拉菜单
2016/05/10 Javascript
jQuery.ajax 跨域请求webapi设置headers的解决方案
2016/08/08 Javascript
Bootstrap的class样式小结
2016/12/01 Javascript
angular forEach方法遍历源码解读
2017/01/25 Javascript
JS获取本地地址及天气的方法实例小结
2019/05/10 Javascript
微信小程序结合Storage实现搜索历史效果
2019/05/18 Javascript
webpack3升级到webpack4遇到问题总结
2019/09/30 Javascript
JavaScript实现拖拽功能
2020/02/11 Javascript
Vue中key的作用示例代码详解
2020/06/10 Javascript
Python 拷贝对象(深拷贝deepcopy与浅拷贝copy)
2008/09/06 Python
python查找目录下指定扩展名的文件实例
2015/04/01 Python
python的keyword模块用法实例分析
2015/06/30 Python
windows下python虚拟环境virtualenv安装和使用详解
2019/07/16 Python
使用Matplotlib 绘制精美的数学图形例子
2019/12/13 Python
Django 返回json数据的实现示例
2020/03/05 Python
python中元组的用法整理
2020/06/15 Python
Python变量及数据类型用法原理汇总
2020/08/06 Python
微信浏览器取消缓存的方法
2015/03/28 HTML / CSS
html5使用window.postMessage进行跨域实现数据交互的一次实战
2021/02/24 HTML / CSS
香港优质食材和美酒专门店:FoodWise
2017/09/01 全球购物
水果花束:Fruit Bouquets
2017/12/20 全球购物
技术总监个人的自我评价范文
2013/12/18 职场文书
小学红领巾广播稿(3篇)
2014/09/13 职场文书
关于成绩下滑的自我检讨书
2014/09/20 职场文书
公司出差管理制度范本
2015/08/05 职场文书