如何在python中沿二维网格移动?
正在解决一个我不知道如何解决的问题。问题要求生成一个函数,该函数使用字符串L(左)、R(右)、F(前)在二维网格中移动箭头。箭头从指向上的位置(0,0)开始。例如,给定字符串“RFLF”,将返回(1,1),因为箭头将指向北方。需要澄清的是,问题并不关心箭头的最终方向,而只关心返回的位置。L和R只影响箭头指向的方向,除非伴随F使箭头指向该方向 一种方法是创建一个名为Point的类,并通过该类运行所有内容:如何在python中沿二维网格移动?,python,for-loop,if-statement,Python,For Loop,If Statement,正在解决一个我不知道如何解决的问题。问题要求生成一个函数,该函数使用字符串L(左)、R(右)、F(前)在二维网格中移动箭头。箭头从指向上的位置(0,0)开始。例如,给定字符串“RFLF”,将返回(1,1),因为箭头将指向北方。需要澄清的是,问题并不关心箭头的最终方向,而只关心返回的位置。L和R只影响箭头指向的方向,除非伴随F使箭头指向该方向 一种方法是创建一个名为Point的类,并通过该类运行所有内容: class Point: def __init__(self, x: int, y:
class Point:
def __init__(self, x: int, y:int , facing: str):
self.x = x
self.y = y
self.facing = facing
def left(self):
if self.facing == 'N':
self.facing = 'W'
elif self.facing == 'W':
self.facing = 'S'
elif self.facing == 'S':
self.facing = 'E'
else:
self.facing = 'N'
def right(self):
if self.facing == 'N':
self.facing = 'E'
elif self.facing == 'E':
self.facing = 'S'
elif self.facing == 'S':
self.facing = 'W'
else:
self.facing = 'N'
def forward(self):
if self.facing == 'N':
self.y += 1
elif self.facing == 'E':
self.x += 1
elif self.facing == 'S':
self.y -= 1
else:
self.x -= 1
def __repr__(self):
return f"(x,y) = {(self.x,self.y)} direction = {self.facing}"
因此,如果实例化此类的对象,则可以相当轻松地将字符串转换为一系列移动,例如:
a = Point(0,0,'N')
for x in 'RFFLF':
if x = 'L':
a.left()
elif x = 'R':
a.right()
else:
a.forward()
print(repr(a))
注意,这是一个相当粗糙的方法。这一切可能通过枚举(N、E、S、W)或使用向量变换矩阵等技巧更简洁地实现。这听起来更像是在网格上移动长度为1的向量,而不是点。向量以(0,0)>>(0,1)开头。L移动将向量变换为(0,0)>>(-1,0)。然后F移动将向量转换为(-1,0)>>(-2,0),是吗?@中微子逻辑,所以L和R实际上不会向前移动,除非F跟随它。除非输入字符串“LF”,否则L不会将向量(0,0)转换为(-1,0)。如果输入的是一个L,则该点将只面向左侧,但仍位于(0,0)处。如果没有额外信息,该点不能面向任何方向,因此语法(0,0)>>(-1,0)将表示原点位于(0,0)的箭头指向(-1,0)。请注意,函数必须以某种形式返回此方向信息,它不能只返回一个点。这个向量方法是实现这一点的一种方法。@中微子逻辑啊,好吧,我有点理解你的意思。问题不一定希望返回方向信息。我想一个更好的解释我想做什么的方法是,实际上把它看作一个箭头,从(0,0)开始,指向北方,然后假设给定一个类似“RFFLF”的字符串,(2,1)将返回,因为它现在所在的位置就是这个点。问题不在于这支箭最终会朝着什么方向。