数字漩涡
还在学校的时候,绍祝师兄每次面试回来,如果有趣题都会和我讨论,因为正好坐他边上,记得这题也是那时讨论的一题。记得当时想了一会后就做出来了。只是时隔多年,再次遇到这题,已经忘记当初是怎么做了。
题目很简单,对于3 打印
1 2 3
8 9 4
7 6 5
对于4,打印
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
观察之后发现规律,先是向右一直走,之后向下一直走,之后向左,最后向上,每次变换方向的原因有两个,一个是走到矩形的边界,另一个是沿着这个方向走,前面的一个位置已经走过了。在当前位置,要找下一个有效位置,只需按顺序遍历上面四个方向即可。写成代码如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26def spiral_number(N):
step_x = [0, 1, 0, -1]
step_y = [1, 0, -1, 0]
a = [[0 for j in xrange(N)] for j in xrange(N)]
dir = 0
i = 0
j = 0
a[i][j] = 1
n = 2
while n <= N ** 2:
x = i + step_x[dir]
y = j + step_y[dir]
if x >= 0 and x < N and y >= 0 and y < N and a[x][y] == 0:
a[x][y] = n
n += 1
i = x
j = y
else:
dir = (dir + 1 + len(step_x)) % len(step_x)
for i in xrange(N):
for j in xrange(N):
print a[i][j],
print
spiral_number(4)