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 相关文章推荐
c++生成dll使用python调用dll的方法
Jan 20 Python
用实例分析Python中method的参数传递过程
Apr 02 Python
Python多线程原理与用法详解
Aug 20 Python
Python面向对象之类的定义与继承用法示例
Jan 14 Python
selenium+python环境配置教程详解
May 28 Python
PHP统计代码行数的小代码
Sep 19 Python
Django框架反向解析操作详解
Nov 28 Python
浅谈tensorflow之内存暴涨问题
Feb 05 Python
python 等差数列末项计算方式
May 03 Python
详解KMP算法以及python如何实现
Sep 18 Python
python线程池 ThreadPoolExecutor 的用法示例
Oct 10 Python
python实现双链表
May 25 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中使用Oracle数据库(4)
2006/10/09 PHP
php打包网站并在线压缩为zip
2016/02/13 PHP
Laravel中如何轻松容易的输出完整的SQL语句
2020/07/26 PHP
(JS实现)MapBar中坐标的加密和解密的脚本
2007/05/16 Javascript
不使用浏览器运行javascript代码的方法
2013/07/24 Javascript
解析Javascript小括号“()”的多义性
2013/12/03 Javascript
jquery trigger伪造a标签的click事件取代window.open方法
2014/06/23 Javascript
JS控制表格实现一条光线流动分割行的方法
2015/03/09 Javascript
原生JavaScript实现Ajax的方法
2016/04/07 Javascript
浅谈JavaScript的自动垃圾收集机制
2016/12/15 Javascript
轻松理解Javascript变量的相关问题
2017/01/20 Javascript
详解微信小程序-获取用户session_key,openid,unionid - 后端为nodejs
2019/04/29 NodeJs
小程序云开发之用户注册登录
2019/05/18 Javascript
自定义javascript验证框架示例【附源码下载】
2019/05/31 Javascript
JS用最简单的方法实现四舍五入
2019/08/27 Javascript
微信小程序实现吸顶效果
2020/01/08 Javascript
python进程管理工具supervisor使用实例
2014/09/17 Python
python超简单解决约瑟夫环问题
2015/05/12 Python
初步讲解Python中的元组概念
2015/05/21 Python
django实现用户登陆功能详解
2017/12/11 Python
解决python xlrd无法读取excel文件的问题
2018/12/25 Python
Python3中的最大整数和最大浮点数实例
2019/07/09 Python
Python中remove漏删和索引越界问题的解决
2020/03/18 Python
Django+Celery实现动态配置定时任务的方法示例
2020/05/26 Python
美国正宗设计师眼镜在线零售商:EYEZZ
2019/03/23 全球购物
为什么UNION ALL比UNION快
2016/03/17 面试题
介绍一下Linux中的链接
2016/06/05 面试题
Java程序员常见面试题
2015/07/16 面试题
大学生两会精神学习心得体会
2014/03/10 职场文书
工地质量标语
2014/06/12 职场文书
“四风”问题的主要表现和危害思想汇报
2014/09/19 职场文书
工商行政处罚决定书
2015/06/24 职场文书
客户答谢会致辞
2015/07/30 职场文书
导游词之扬州大明寺
2019/10/09 职场文书
mysql 带多个条件的查询方式
2021/06/05 MySQL
使用Spring处理x-www-form-urlencoded方式
2021/11/02 Java/Android