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 ...
随机推荐
- hibernate.properties官方属性用例(可用于hibernate.cfg.xml属性参考)
######################### Query Language ######################### ## define query language constant ...
- Math.Round函數
Math.Round這個函數的解釋是將值按指定的小數位數舍入,但並不就是四捨五入.這種舍入有時稱為就近舍入或四舍六入五成雙 其實在 VB, VBScript, C#, J#, T-SQL 中 Roun ...
- Newtonsoft.Json学习笔记
Newtonsoft.Json,一款.NET中开源的Json序列化和反序列化类库(下载地址http://json.codeplex.com/). 下面是Json序列化和反序列化的简单封装: /// & ...
- HackerRank "Favorite sequence"
Typical topological sorting problem .. why is it 'difficult'? #include <iostream> #include < ...
- (转)WEB第三方打印控件[ASP.NET常用工具]
本文转载自:http://blog.csdn.net/chz_cslg/article/details/25415347 在B/S模式开发中,打印是个很大的困扰.无论是采用页面直接输出或者引用WORD ...
- 深度优化LNMP
优化前准备工作 Centos准备及配置 准备安装包及软件:http://pan.baidu.com/s/1chHQF 下载解压到U盘即可安装http://pan.baidu.com/s/15TUWf ...
- Eclipse:启动时提示"Failed to load the JNI shared library"的解决方案
今天打开Eclipse,弹出提示框"Failed to load the JNI shared library" 原因1:给定目录下jvm.dll不存在. 对策:(1)重新安装jr ...
- 发布一个.net mvc站点遇到的问题及解决
1.先通过vs2012发布.net mvc项目,遇到问题是一路默认下来,提示发布已成功,但对应文件夹里没有任何文件 解决: 第一步,新建了一个文件夹 第二步,在[配置文件]步骤,新建配置文件 第三步, ...
- 配置文件——WebApp.config文件读取和修改
using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using ...
- [Java A] – is not an enclosing class
public class A {public class B { }}; 需要实例B类时,按照正逻辑是,A.B ab = new A.B();那么编译器就会出现一个错误–“is not an encl ...