关于输出螺旋矩阵的demo

输出类似

1 2 3

8 9 4

7 6 5

主要难点是如何找到表示的算法

我的理解是,先生成一个n*n的矩阵,然后再往里面塞数字,而塞的方法分别有四种:由左往右,由上往下,由右往左,由下往上,没塞完的话就继续循环这四步

一开始让我想算法我是拒绝的,所以我用了笨方法,就是手写了前几次生成逻辑,试图找出其中规律,幸好这个并不难,写了两轮就找到了其中规律,但是,但是,但是,现在的我还不会用自然语言将其描述出来,只能写成逻辑表示,这个希望日后会回来填坑。

还有在推的过程发现了另外一个规律,就是无论n多大,都是只需要2n - 1步就可以把数字塞完。

 1 # -*- coding:utf-8 -*-
 2 
 3 
 4 def ppstr(i):
 5     return str(i).center(5, ' ')
 6 
 7 def luoxuanboom(n=None):
 8     if n == None:
 9         n = 10
10     final = []
11     for _ in range(n):
12         final.append(['0'] * n)  # 生成一个n*n的矩阵
13         
14     num_list = list(map(ppstr, list(range(1, n**2 + 1))))  # 生成数组
15     num_id = 0
16     
17     px, py = 0, 1
18     times = 0
19     while True:
20         for i in range(px, n-px): # 由左往右塞数字
21             final[px][i] = num_list[num_id] 
22             num_id += 1
23             
24         times += 1  # 方便统计塞的次数
25         if num_id == len(num_list):  # 判断是否已经塞完了
26             break
27             
28         for i in range(py, n-px):  # 由上往下
29             final[i][n-py] = num_list[num_id] 
30             num_id += 1
31         
32         times += 1
33         if num_id == len(num_list):
34             break
35         
36         for i in range(n-(py+1), px-1, -1):  # 由右往左
37             final[n-py][i] = num_list[num_id] 
38             num_id += 1
39         
40         times += 1
41         if num_id == len(num_list):
42             break
43         
44         for i in range(n-(py+1), py-1, -1):  # 由下往上
45             final[i][px] = num_list[num_id]  
46             num_id += 1
47         
48         times += 1
49         if num_id == len(num_list):
50             break
51         
52         px += 1
53         py += 1
54         
55     for bb in final:
56         print('  '.join(bb))
57     print('times:', times)
58     
59 if __name__ == '__main__':
60     luoxuanboom()

 

posted @ 2017-06-23 16:32  Nanrou  阅读(178)  评论(0编辑  收藏  举报