Python实现顺时钟回形矩阵
2015-08-14 20:28
746 查看
无意间在网上看到了一个面试题是,写出一个回形矩阵。实现的效果大致如下:
[ 1, 2, 3, 4, 5]
[16, 17, 18, 19, 6]
[15, 24, 25, 20, 7]
[14, 23, 22, 21, 8]
[13, 12, 11, 10, 9]
因为日常都是使用Python,刚开始觉得使用list的append方法就可以做出来,动手一下发现还是不行的。后来,觉得应该先根据参数容量制作一个list,用list的替换方法来做替换。处理的过程中,还是发现有很多思维断掉的地方。
最后,在别人的博客上看到2004年,有人用Python实现了逆时钟方向的回形矩阵。借鉴了一下他的方法。大致的思路是这样的:
第0步:回形矩阵的特点是什么?
顺时钟回形矩阵,在等差值为1的情况下,按照一个回形为一层的情况来看:
推导的前三条矩阵边上的 “结束值” - “起始值” = “矩阵边长”-1,第四条矩阵边的 "结束值" 为 该层的起始值。
[ 1, 2, 3, 4, 5]
[16, , , , 6]
[15, , , , 7]
[14, , , , 8]
[13,12,11,10,9]
第一步,根据设定的矩阵边长,生成一个二维数组(C语言中这么描述,Python就是list里面嵌套list)
第二步,按照矩阵边长生成该层的数据池:
最终代码:
[ 1, 2, 3, 4, 5]
[16, 17, 18, 19, 6]
[15, 24, 25, 20, 7]
[14, 23, 22, 21, 8]
[13, 12, 11, 10, 9]
因为日常都是使用Python,刚开始觉得使用list的append方法就可以做出来,动手一下发现还是不行的。后来,觉得应该先根据参数容量制作一个list,用list的替换方法来做替换。处理的过程中,还是发现有很多思维断掉的地方。
最后,在别人的博客上看到2004年,有人用Python实现了逆时钟方向的回形矩阵。借鉴了一下他的方法。大致的思路是这样的:
第0步:回形矩阵的特点是什么?
顺时钟回形矩阵,在等差值为1的情况下,按照一个回形为一层的情况来看:
推导的前三条矩阵边上的 “结束值” - “起始值” = “矩阵边长”-1,第四条矩阵边的 "结束值" 为 该层的起始值。
[ 1, 2, 3, 4, 5]
[16, , , , 6]
[15, , , , 7]
[14, , , , 8]
[13,12,11,10,9]
第一步,根据设定的矩阵边长,生成一个二维数组(C语言中这么描述,Python就是list里面嵌套list)
for i in range(size): arry.append(range(size))
第二步,按照矩阵边长生成该层的数据池:
while size >0 : create pool() layer += 1 size -= 2
最终代码:
#!/usr/bin/env python # coding: utf-8 def draw_matrix(begin, size, layer, arry, controlle_num): # 以顺时钟方向建立递增矩阵,按照层级 # 根据递增1的特点,建立当前层的上下左右,四个list,形成资源池 # 每个方向list的长度都等于size的长度 # [1,2,3] # [8, ,4] # [7,6,5] top = range(begin, begin+size) right = range(begin+size-1, begin+size*2-1) bottom = range(begin+size*2-2, begin+size*3-2) left = range(begin+size*3-3, begin+size*4-3) left[size-1] = begin # 顺时钟的左list最后一个值改为起始值 # size相当矩阵的边长,i既可以表示长,也可以表示宽 # 通过i步进来从本层的资源池里面取得各个值 for i in range(size): arry[layer][layer+i] = top[i] arry[layer+i][controlle_num-layer-1] = right[i] arry[controlle_num-layer-1][controlle_num-layer-i-1] = bottom[i] arry[controlle_num-1-layer-i][layer] = left[i] return arry def Matrix(size, begin=1, layer=0): controlle_num = size arry = [] for i in range(size): arry.append(range(size)) while size > 0: arry = draw_matrix(begin, size, layer, arry, controlle_num) begin = begin+(4*(size-1)) size = size - 2 layer = layer + 1 return arry if __name__ == '__main__': dat = Matrix(5) for i in range(5): print dat[i]
相关文章推荐
- python3之循环
- 树莓派用Python写几个简单程序4:socket的使用
- Python爬虫之<单线程爬虫>
- python:元组和小括号的误导
- 05 数字 - 《Python 核心编程》
- Python学习笔记23:Django构建一个简单的博客网站(一个)
- Python使用wxPython、py2exe编写桌面程序
- Python GUI编程(Tkinter)
- python+Eclipse+pydev环境搭建
- Python不需要预先定义变量
- (原创)Python文件与文件系统系列(2)——os模块对文件、文件系统操作的支持
- (原创)Python文件与文件系统系列(5)——stat模块
- (原创)Python文件与文件系统系列(4)——文件描述字操作
- Python学习笔记10
- pythonchallenge(二)
- pythonchallenge(三)
- python—networkx:根据图的权重画图
- python统计pv、uv
- saltstack的深入-管理python-pip
- Python 不是 C