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实现封装得到virustotal扫描结果
Oct 05 Python
Python的SQLAlchemy框架使用入门
Apr 29 Python
在Django的视图(View)外使用Session的方法
Jul 23 Python
怎样使用Python脚本日志功能
Aug 14 Python
Python AES加密实例解析
Jan 18 Python
python numpy格式化打印的实例
May 14 Python
在scrapy中使用phantomJS实现异步爬取的方法
Dec 17 Python
解决pycharm工程启动卡住没反应的问题
Jan 19 Python
Django基于客户端下载文件实现方法
Apr 21 Python
python Django 反向访问器的外键冲突解决
May 20 Python
python爬虫爬取网页数据并解析数据
Sep 18 Python
Python手拉手教你爬取贝壳房源数据的实战教程
May 21 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
肝肠寸断了解下!盘点史上最伤心的十大动漫
2020/03/04 日漫
PHP4实际应用经验篇(2)
2006/10/09 PHP
傻瓜化配置PHP环境――Appserv
2006/12/13 PHP
深入解析phpCB批量转换的代码示例
2013/06/27 PHP
laravel 错误处理,接口错误返回json代码
2019/10/25 PHP
HTML中事件触发列表与解说
2007/07/09 Javascript
js CSS操作方法集合
2008/10/31 Javascript
实现JavaScript中继承的三种方式
2009/10/16 Javascript
JavaScript Eval 函数使用
2010/03/23 Javascript
js报错 Object doesn't support this property or method的原因分析
2011/03/31 Javascript
jquery 选择器引擎sizzle浅析
2013/02/06 Javascript
javascript数组操作总结和属性、方法介绍
2014/04/05 Javascript
JavaScript插件化开发教程(五)
2015/02/01 Javascript
学习javascript的闭包,原型,和匿名函数之旅
2015/10/18 Javascript
nodejs多版本管理总结
2018/04/03 NodeJs
JavaScript中发出HTTP请求最常用的方法
2018/07/12 Javascript
js实现跟随鼠标移动的小球
2019/08/26 Javascript
layui 弹出层值回传解决方式
2019/11/14 Javascript
JS实现点餐自动选择框(案例分析)
2019/12/10 Javascript
JavaScript实现滑动门效果
2020/01/18 Javascript
在Python中进行自动化单元测试的教程
2015/04/15 Python
Python基于checksum计算文件是否相同的方法
2015/07/09 Python
Django REST框架创建一个简单的Api实例讲解
2019/11/05 Python
Python文件操作模拟用户登陆代码实例
2020/06/09 Python
matplotlib 范围选区(SpanSelector)的使用
2021/02/24 Python
中国专业的音频分享平台:喜马拉雅
2019/05/24 全球购物
企业年会主持词
2014/03/27 职场文书
高中国旗下的演讲稿
2014/08/28 职场文书
法律专业大学生职业生涯规划书:向目标一步步迈进
2014/09/22 职场文书
“四风”问题自我剖析材料思想汇报
2014/09/23 职场文书
党的群众路线批评与自我批评范文
2014/10/16 职场文书
2016春节家属慰问信
2015/03/25 职场文书
2016新年年会主持词
2015/07/06 职场文书
党校培训学习心得体会
2016/01/06 职场文书
JavaScript 去重和重复次数统计
2021/03/31 Javascript
Pytest之测试命名规则的使用
2021/04/16 Python