用 Python 制作数字螺旋
好了,好了,你们尽管来鄙视我吧,这个怪诞的想法来着于 Rikku 家中洗衣机的水流漩涡:让数字从外至内以螺旋地形式排列,当然,是要用 Python 来实现。这
是一个很有意思的挑战,下面是要达成的结果:
1 2 3
10 11 4
9 12 5
8 7 6
不知道你看懂了没。- -!!
说明一下,这些数字的排列规律是以顺时针螺旋向内的方式排列的,下面是个更大的示例,也是 Rikku 今天要达成的目标:
1 2 3 4 5
18 19 20 21 6
17 28 29 22 7
16 27 30 23 8
15 26 25 24 9
14 13 12 11 10
为此,该方案应以空格隔开两个数字,你输入输出的东西代表了宽度和高度相等的矩阵。然后,你需要确定在每个需要输出数字在矩阵中的位置,所以当它们被打印到屏幕上,看起来就像上面的例子那样。
我好像从来没做过螺旋矩阵,所以我说它是一个挑战。但我的目的就是想尽一切办法去实现它,Rikku 会使用一些算法来取代,这个漩涡是在转动,沿着负值的方向,以顺时针方式横向排列矩阵的点,那么数字“1”就是x,y轴的交汇点,也就是 (0,0)。我实施了不少方案,走了很多弯路,碰了很多次壁,但是 Rikku 不气馁,因为 Rikku 还没有从无聊的阴影中走出来,下面的代码可以成功实现这个方案,但我想它也许还有更好的方案,当然,您就当 Rikku 是在抛砖引玉好了:
#!/usr/bin/env python
def number_spiral(h, w):
# total number of elements in array
n = w * h# start at top left (row 0 column 0)
row, column = 0,0# first move is on the same row, to the right
d_row, d_column = 0, 1# fill 2d array with dummy values we'll overwrite later
arr = [[None ]* w for z in range(h)]for i in xrange(1,n+1):
arr[row][column] = i# next row and column
nrow, ncolumn = row + d_row, column + d_columnif 0 <= nrow < h and 0 <= ncolumn < w and arr[nrow][ncolumn] == None:
# no out of bounds accesses or overwriting already-placed elements.
row, column = nrow, ncolumn
else:
# change direction
d_row , d_column = d_column, -d_row
row, column = row + d_row, column + d_column# print it out!
for a in range(h):
for b in range(w):
print "%2i" % arr[a][b],if __name__ == '__main__':
number_spiral(5, 3)
如果您有更好的方案,请不吝赐教,Rikku 洗耳恭听。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。