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)

1 for i in range(size):
2         arry.append(range(size))

  第二步,按照矩阵边长生成该层的数据池:

1 while size >0 :
2     create pool()
3     layer += 1        
4     size -= 2

  最终代码:

  

 1 #!/usr/bin/env python
 2 # coding: utf-8
 3 
 4 
 5 def draw_matrix(begin, size, layer, arry, controlle_num):
 6     # 以顺时钟方向建立递增矩阵,按照层级
 7     # 根据递增1的特点,建立当前层的上下左右,四个list,形成资源池
 8     # 每个方向list的长度都等于size的长度
 9     # [1,2,3]
10     # [8, ,4]
11     # [7,6,5]
12     top = range(begin, begin+size)
13     right = range(begin+size-1, begin+size*2-1)
14     bottom = range(begin+size*2-2, begin+size*3-2)
15     left = range(begin+size*3-3, begin+size*4-3)
16     left[size-1] = begin       # 顺时钟的左list最后一个值改为起始值
17 
18     # size相当矩阵的边长,i既可以表示长,也可以表示宽
19     # 通过i步进来从本层的资源池里面取得各个值
20     for i in range(size):
21         arry[layer][layer+i] = top[i]      
22         arry[layer+i][controlle_num-layer-1] = right[i]
23         arry[controlle_num-layer-1][controlle_num-layer-i-1] = bottom[i]
24         arry[controlle_num-1-layer-i][layer] = left[i]
25     return arry
26 
27 
28 def Matrix(size, begin=1, layer=0):
29     controlle_num = size
30     arry = []
31     for i in range(size):
32         arry.append(range(size))
33     while size > 0:
34         arry = draw_matrix(begin, size, layer, arry, controlle_num)
35         begin = begin+(4*(size-1))
36         size = size - 2
37         layer = layer + 1
38     return arry
39 
40 
41 if __name__ == '__main__':
42     dat = Matrix(5)
43     for i in range(5):
44         print dat[i]

 

转载于:https://www.cnblogs.com/dongxiaozhuo/p/4731077.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值