无意间在网上看到了一个面试题是,写出一个回形矩阵。实现的效果大致如下:  

  [ 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实现顺时钟回形矩阵的更多相关文章

  1. 2.python算法之回形矩阵

    代码: #!/usr/bin/env python # encoding: utf-8 """ @author: 侠之大者kamil @file: 2.回形矩阵.py @ ...

  2. 回形矩阵--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 ...

  3. Python 中的几种矩阵乘法 np.dot, np.multiply, *【转】

    本文转载自:https://blog.csdn.net/u012609509/article/details/70230204 Python中的几种矩阵乘法1. 同线性代数中矩阵乘法的定义: np.d ...

  4. Python合并两个numpy矩阵

    numpy是Python用来科学计算的一个非常重要的库,numpy主要用来处理一些矩阵对象,可以说numpy让Python有了Matlab的味道. 实际的应用中,矩阵的合并是一个经常发生的操作,如何利 ...

  5. Python中的几种矩阵乘法(转)

    一.  np.dot() 1.同线性代数中矩阵乘法的定义.np.dot(A, B)表示: 对二维矩阵,计算真正意义上的矩阵乘积. 对于一维矩阵,计算两者的内积. 2.代码 [code] import ...

  6. Python 中的几种矩阵乘法 np.dot, np.multiply, *

    使用array时,运算符 * 用于计算数量积(点乘),函数 dot() 用于计算矢量积(叉乘).使用matrix时,运算符 * 用于计算矢量积,函数 multiply() 用于计算数量积. 下面是使用 ...

  7. python 入门(一)矩阵处理

    numpy 使用 1.使用 array 定义矩阵 dataSet = array([[1.0,1.1],[1.0,1.0],[0.0,0.0],[0,0.1]]) 2.使用 shape 返回矩阵的行数 ...

  8. python 用嵌套列表做矩阵加法

    写一个函数,接收两个由嵌套列表模拟成的矩阵,返回一个嵌套列表作为计算结果,要求运行效果如下: >>> matrix1 = [[1, 1], [-3, 4]] >>> ...

  9. python学习1---列表、矩阵、数组

    1.列表与数组区别 numpy数组的所有元素类型是相同的,而列表的元素类型是任意的. 2.numpy数组与矩阵区别 矩阵必须是二维的,数组可以是多维的,matrix是array的一个分支. matri ...

随机推荐

  1. Hibernate3回顾-4-事务和并发管理

    4.事务和并发 Hibernate是对JDBC的轻量级对象封装,Hibernate本身是不具备Transaction处理功能的,Hibernate的Transaction实际上是底层的JDBC Tra ...

  2. IOS开发-UITextField代理常用的方法总结

    1.//当用户全部清空的时候的时候 会调用 -(BOOL)textFieldShouldClear:(UITextField *)textField: 2.//可以得到用户输入的字符 -(BOOL)t ...

  3. json换行符的处理

    JS端的: var s = JSON.stringify(str); var ss = s.replace(/\\n/g, "\\n") .replace(/\\'/g, &quo ...

  4. 三星电视删除USB播放记录

    当使用三星UA40系列电视机播放USB设备中的文件后,会将播放的历史记录存储在电视里.如果想要清除这些播放记录,需要将电视机复位,操作方法如下: 这里提醒您:复位后电视的所有设置都将恢复为出厂默认设置 ...

  5. Axure RP

    Axure RP是一个专业的快速原型设计工具.Axure(发音:Ack-sure),代表美国Axure公司:RP则是Rapid Prototyping(快速原型)的缩写. Axure RP是美国Axu ...

  6. secure crt 基本设置

    基本设置1.修改设置 为了SecureCRT用起来更方便,需要做一些设置,需要修改的有如下几处: 1.退 出主机自动关闭窗口 Options => Global ptions => Gen ...

  7. visual studio 2013 中常用的一些快捷键

    在编辑代码或者复制网上的代码段到VS2013中时,代码会显示的非常乱,这里便可以通过 vs2013中的快捷键进行自动对齐操作[ctrl+k+f],类似的快捷操作还有很多,在这里给大家总结一下,以提高编 ...

  8. VB脚本调用exe应用程序并传递参数

    VB脚本调用应用程序,并传递参数给exe应用程序: Private Sub CommandButton1_Click() Dim a a = Shell("D:\\ExperimentLin ...

  9. 浅谈Redis数据库的键值设计(转)

    丰富的数据结构使得redis的设计非常的有趣.不像关系型数据库那样,DEV和DBA需要深度沟通,review每行sql语句,也不像memcached那样,不需要DBA的参与.redis的DBA需要熟悉 ...

  10. DBA_Oracle数据库运维监控(案例)

    2014-07-27 Created By BaoXinjian