
下面是我研究的向量旋转法,又和”海龟”扯上联系了。一只看不见的“小海龟”在数组中通过二维向量旋转90度,让它只能上下左右移动。在程序中设计了一个叫ArrayTurtle的类。它有step方法让对象在array中前进或者倒退一个单位。最关键的是turn方法,让对象旋转90度。数学理论来源于二维向量旋转。如下图所示:
以下是源代码:
"""Python信息学竞赛蛇形填数向量旋转法.py by 李兴球"""
class ArrayTurtle:
def __init__(self,i,j,h,array):
"""i:初始行位置,j:初始列位置,
h:二元组,表示初始方向,array:二维数组"""
self.i = i
self.j = j
self.h = h # 下(1,0),左(0,-1),上(-1,0),右(0,1)
self.array = array
self.rows = len(array) # 总行数
self.cols = len(array[0]) # 总列数
self.mileage = 1 # 用于统计里程(假定在初始位置就有1个里程了)
self.set_value()
self.matrix = [(0,-1),(1,0)] # 变换矩形
def step(self,k=1): # 前进1格或者-1格
self.i += int(self.h[0]) * k
self.j += int(self.h[1]) * k
self.mileage += k
def set_value(self):
#self.array[self.i][self.j] = self.mileage
self.array[self.i][self.j] = self.rows*self.cols + 1 - self.mileage
def current_value(self):
return self.array[self.i][self.j]
def goto_end(self):
return self.mileage == self.rows*self.cols
def beyond_boundary(self):
"""超出边界"""
return self.i<0 or self.i>=self.rows or \
self.j<0 or self.j>=self.cols
def turn(self): # 左转向90度
# 矩形乘法
x = self.h[0] * self.matrix[0][0] + self.h[1] * self.matrix[0][1]
y = self.h[0] * self.matrix[1][0] + self.h[1] * self.matrix[1][1]
self.h = (x,y)
def display(self):
for row in self.array:
for col in row:
print(f"{col:3d}",end=' ')
print()
print()
n = 8
matrix = [ [0 for i in range(n)] for i in range(n)]
i,j = 0,0
t = ArrayTurtle(i,j,(1,0),matrix)
t.set_value()
while True:
while True:
t.step(1) # 在当前方向前进一个单位
if not t.beyond_boundary() and t.current_value()==0: # 没超出边界或没走过,则倒退
t.set_value()
else:
t.step(-1)
break
t.turn()
if t.goto_end():break
t.display()
Python信息学竞赛蛇形填数向量旋转法.py by李兴球

