输出类似
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()