Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中沿二维网格移动?_Python_For Loop_If Statement - Fatal编程技术网

如何在python中沿二维网格移动?

如何在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:

正在解决一个我不知道如何解决的问题。问题要求生成一个函数,该函数使用字符串L(左)、R(右)、F(前)在二维网格中移动箭头。箭头从指向上的位置(0,0)开始。例如,给定字符串“RFLF”,将返回(1,1),因为箭头将指向北方。需要澄清的是,问题并不关心箭头的最终方向,而只关心返回的位置。L和R只影响箭头指向的方向,除非伴随F使箭头指向该方向

一种方法是创建一个名为Point的类,并通过该类运行所有内容:

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)将返回,因为它现在所在的位置就是这个点。问题不在于这支箭最终会朝着什么方向。