📜  门| GATE-CS-2004 |第 73 题(1)

📅  最后修改于: 2023-12-03 15:42:15.655000             🧑  作者: Mango

题目

门| GATE-CS-2004 |第 73 题

介绍

这是一道GATE-CS-2004年第73题,考察了程序员的逻辑思考能力和编程知识。

首先,题目描述了一个机器人在一个二维平面上移动,可以向上、下、左、右四个方向移动。给出了一个表示机器人移动序列的字符串,其中‘U’表示向上移动,‘D’表示向下移动,‘L’表示向左移动,‘R’表示向右移动。机器人初始位置为(0,0),请你计算机器人在移动完整个序列后,最终到达原点(0,0)的概率。

其次,我们需要考虑解题的思路。显然,我们可以采取递归和动态规划两种方式。接下来,我们分别介绍两种思路。

递归

对于每一步,机器人有四种选择:向上、下、左、右移动。对于每种选择,我们可以递归调用函数,计算下一步机器人移动后,到达原点的概率。

当字符串被递归完后,如果机器人在(0,0)位置,我们返回1,否则返回0。

下面是递归方式的代码:

def moveRobot(x, y, idx, s):
    if x == 0 and y == 0:
        return 1
    if idx == len(s):
        return 0
    prob = 0
    if s[idx] == 'U':
        prob += moveRobot(x, y+1, idx+1, s)
    elif s[idx] == 'D':
        prob += moveRobot(x, y-1, idx+1, s)
    elif s[idx] == 'L':
        prob += moveRobot(x-1, y, idx+1, s)
    elif s[idx] == 'R':
        prob += moveRobot(x+1, y, idx+1, s)
    return prob
动态规划

我们可以使用动态规划(DP)的方式解决这个问题。我们使用一个一维数组来存储每一步机器人的位置。设dp[i]表示第i步机器人到达原点的概率,则有以下递推公式:

$dp[j] = \frac{1}{4}(dp[j-1]+dp[j+1]+dp[j-n]+dp[j+n])$

其中,j表示机器人当前所在位置的下标,n表示每行的长度。

当机器人移动完所有步骤后,返回dp[n//2]的值,即机器人在(0,0)位置的概率。

下面是动态规划方式的代码:

def moveRobot(s):
    n = 2 * len(s)
    dp = [0] * n
    dp[n//2] = 1
    for i in s:
        dpNew = [0] * n
        for j in range(n):
            if dp[j] > 0:
                if j > 0:
                    dpNew[j-1] += 0.25 * dp[j]
                if j < n-1:
                    dpNew[j+1] += 0.25 * dp[j]
                if j >= len(s):
                    dpNew[j-len(s)] += 0.25 * dp[j]
                else:
                    dpNew[j+len(s)] += 0.25 * dp[j]
        dp = dpNew
    return dp[n//2]
总结

本题考察了程序员的逻辑思考能力和编程知识,需要灵活运用递归和动态规划两种方法解决问题。递归方式需要注意终止条件的设置,动态规划需要注意数组下标的计算。