限制重复的二维路径序列

时间:2015-11-01 03:52:38

标签: algorithm graph

输入

给定 n 字符的字符串序列,仅包含:

  • " G" - 走吧,朝着现在的方向前进
  • " L" - 向左转动当前方向
  • " R" - 将当前方向改正

输出

如果一个人无限次执行序列,如果绘制的图形可以被有限半径的圆束限,则返回true;除此以外;返回false

我的尝试

我认为(仅基于几个例子并试图识别模式)重要的度量标准是向左和向右移动的计数。

我假设左右平等运动表明一个不包含的序列;我非常怀疑这是正确的,因为我不确定如何在不改变方向的情况下处理运动?即" RGG" " LGRGG"

不幸的是,我陷入了执行困境。以下是我在psuedo-code中的尝试:

def isBounded(string sequence) {
    commands = list{}
    directionStack = stack{}
    directionStack.push(findReverse(sequence, [](char a){ a != 'G' })) // search for the last direction command

    for c in sequence {
        if c == 'G' {
            commands.append(directionStack.pop())
        } else {
            directionStack.push(c)
        }
    }

    lefts = commands.count('L')
    rights = commands.count('R')
    return lefts != rights
}

我不认为这是正确的:

  • RGLGRGG
  • GRGLGLGLG

2 个答案:

答案 0 :(得分:0)

如果起点与终点相同,无论终点到达的方向如何,都可以绑定形状。实现一种“播放”的算法并不难。 G,L,R的序列,并检查终点是否等于起点。对不起我的haskell:

move ((x,y),(dx,dy)) 'G' = ((x+dx,y+dy),(dx,dy))
move ((x,y),(dx,dy)) 'R' = ((x,y), (dy,-dx))
move ((x,y),(dx,dy)) 'L' = ((x,y), (-dy,dx))

play start [] = start
play start (x:xs) = play (move start x) xs

canBound sequence = (fst $ play (start,direction) sequence) == start where
    start = (0,0)
    direction = (0,1)

答案 1 :(得分:0)

使用笛卡尔平面上的简单线性代数可以很容易地证明问题的解决方案。

答案

无限重复有限序列 p 的结果路径 s 始终是有界的,除非转弯的差异(定义为:{ {1}})是4的倍数, diff=|leftTurns - rightTurns| 的结束位置不等于起始位置。

证明

案例1 s< ==>终止面向初始方向

  • 在起始位置结束diff % 4 == 0 ==> 有界,每次迭代将始终沿有限路径返回(0,0)。

  • 结束于(0,0) ==> 无界,每个渐进式迭代(x,y) != (0,0)将移至n+1P(n+1) = P(n) + (x,y)位置。由于P(n) = n * (x,y)所以n->inf

案例2 P(n)->inf< ==>终止朝向初始方向的左/右旋转

为了简单起见,我们假设还剩1个而不是。或者逆时针旋转90度。

迭代:(开始位置) - > (结束位置)

  1. diff % 4 == 1 - > (0,0)

    在下一次迭代中,我们将以相同的距离行进,但是在左旋转的方向上。因此,使用相应的变换矩阵,我们的更新向量是:

    enter image description here

  2. (x,y) - > (x,y)

    我们的更新向量再次向左旋转,所以:

    enter image description here

  3. (x - y,y + x) - > (x - y,y + x)

    再次轮换我们的更新向量:

    enter image description here

  4. (-y, x) - > (-y, x)

    最后,我们到达了我们的起始位置,正面临着我们的初步方向:

    enter image description here

  5. 案例3 (0,0)< ==>终止面向初始方向左/右的2个旋转

    迭代:(开始位置) - > (结束位置):

    1. diff % 4 == 2 - > (0,0)

      两次90度旋转:

      1:enter image description here

      2:enter image description here

    2. (x,y) - > (x,y)

      回到面向初始方向的起始位置。

    3. 案例4 (0,0)< ==>终止面向初始方向左/右的3次旋转

      左/右单个旋转的等效证明(参见案例2)