Python实现顺时钟回形矩阵
无意间在网上看到了一个面试题是,写出一个回形矩阵。实现的效果大致如下:
[ 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]
Python实现顺时钟回形矩阵的更多相关文章
- 2.python算法之回形矩阵
代码: #!/usr/bin/env python # encoding: utf-8 """ @author: 侠之大者kamil @file: 2.回形矩阵.py @ ...
- 回形矩阵--python
def bsm(n): a = [[0]*n for x in range(n)] p = 0 q = n-1 t = 1 while p < q: for i in range(p,q): a ...
- Python 中的几种矩阵乘法 np.dot, np.multiply, *【转】
本文转载自:https://blog.csdn.net/u012609509/article/details/70230204 Python中的几种矩阵乘法1. 同线性代数中矩阵乘法的定义: np.d ...
- Python合并两个numpy矩阵
numpy是Python用来科学计算的一个非常重要的库,numpy主要用来处理一些矩阵对象,可以说numpy让Python有了Matlab的味道. 实际的应用中,矩阵的合并是一个经常发生的操作,如何利 ...
- Python中的几种矩阵乘法(转)
一. np.dot() 1.同线性代数中矩阵乘法的定义.np.dot(A, B)表示: 对二维矩阵,计算真正意义上的矩阵乘积. 对于一维矩阵,计算两者的内积. 2.代码 [code] import ...
- Python 中的几种矩阵乘法 np.dot, np.multiply, *
使用array时,运算符 * 用于计算数量积(点乘),函数 dot() 用于计算矢量积(叉乘).使用matrix时,运算符 * 用于计算矢量积,函数 multiply() 用于计算数量积. 下面是使用 ...
- python 入门(一)矩阵处理
numpy 使用 1.使用 array 定义矩阵 dataSet = array([[1.0,1.1],[1.0,1.0],[0.0,0.0],[0,0.1]]) 2.使用 shape 返回矩阵的行数 ...
- python 用嵌套列表做矩阵加法
写一个函数,接收两个由嵌套列表模拟成的矩阵,返回一个嵌套列表作为计算结果,要求运行效果如下: >>> matrix1 = [[1, 1], [-3, 4]] >>> ...
- python学习1---列表、矩阵、数组
1.列表与数组区别 numpy数组的所有元素类型是相同的,而列表的元素类型是任意的. 2.numpy数组与矩阵区别 矩阵必须是二维的,数组可以是多维的,matrix是array的一个分支. matri ...
随机推荐
- c# 可以设置透明度的 Panel 组件
using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; u ...
- Async 和 Await的性能(.NET4.5新异步编程模型)
异步编程长时间以来一直都是那些技能高超.喜欢挑战自我的开发人员涉足的领域 — 这些人愿意花费时间,充满热情并拥有心理承受能力,能够在非线性的控制流程中不断地琢磨回调,之后再回调. 随着 Microso ...
- 【设计模式】装饰者模式(Decorator)
装饰者模式 动态的将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案. Java I/O中的装饰类 示例:coffee装饰者模式类图 顶层超类 被装饰组件-被装饰者 装饰者抽象类 ...
- 51nod1369 无穷印章
有一个印章,其完全由线段构成.这些线段的线足够细可以忽略其宽度,就像数学上对线的定义一样,它们没有面积.现在给你一张巨大的白纸(10亿x10亿大小的纸,虽然这个纸很大,但是它的面积毕竟还是有限的),你 ...
- php 获取中文的拼音
注意事项: 无法识别的中文 亳:bo,如果有此字,结果为空,调用此类之前需要手动加判断 蚌:bang,beng,多音字 莞:guan 圳:zhen 儋:dan 漯:luo 濮:pu 泸:lu 衢:qu ...
- Keepalived高可用软件的安装与配置
监听和替换多台服务器之间的来回切换 一.安装tar zxvf keepalived-1.1.15.tar.gzcd keepalived-1.1.15./configure --prefix=/usr ...
- Linux大文件传输(转)
我们经常需要在机器之间传输文件.比如备份,复制数据等等.这个是很常见,也是很简单的.用scp或者rsync就能很好的完成任务.但是如果文件很大,需要占用一些传输时间的时候,怎样又快又好地完成任务就很重 ...
- Navicat(连接) -1之常规设置
常规设置 要成功地创建一个新的连接到本机或远程服务器 - 不管通过 SSL.SSH 或 HTTP,都要在常规选项卡中设置连接属性.如果你的互联网服务供应商(ISP)不提供直接访问其服务器,安全通道协定 ...
- DBA_Oracle数据库运维监控(案例)
2014-07-27 Created By BaoXinjian
- python--输入一组无序的数,排序
N=int(raw_input('input the number N=')) number=[] while(N): m=int(raw_input('input..\n')) number.app ...