用 Python 制作数字螺旋

Rikku 在无聊的时候经常会盯着一些非常枯燥而又有规律的事物发呆。比方说,Rikku 家里有一台洗衣机,它在洗衣服时,缸中的水是呈漩涡状的…

好了,好了,你们尽管来鄙视我吧,这个怪诞的想法来着于 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_column

      if 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],
      print

if __name__ == '__main__':
   number_spiral(5, 3)

如果您有更好的方案,请不吝赐教,Rikku 洗耳恭听。 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。