📌  相关文章
📜  给定动作后,检查机器人是否在网格的边界内

📅  最后修改于: 2021-04-29 15:28:02             🧑  作者: Mango

给定一个大小为NXM的网格,并在单元(N – 1,M – 1)处放置了一个机器人。同样,给定的字符串str仅由字符“ U” (上), “ D” (下), “ L” (左)和“ R” (右)组成,代表机器人将在网格中执行的动作。任务是查找机器人在最后移动结束后是否安全。如果机器人在网格范围之内,则可以说是安全的。
注意:请考虑在数字线下方存在矩形网格,并且左上角位于原点上。
例子:

方法:对于每一步,更新机器人在网格内的位置。如果机器人在任何移动位置都在网格之外,则输出为“”。如果对于所有移动,机器人都在网格的边界内,则输出“是”。
下面是上述方法的实现:

C++
// C++ implementation of the approach
#include 
using namespace std;
 
// Function that returns true if the robot is safe
bool isSafe(int N, int M, string str)
{
 
    int coll = 0, colr = 0, rowu = 0, rowd = 0;
 
    for (int i = 0; i < str.length(); i++) {
 
        // If current move is "L" then
        // increase the counter of coll
        if (str[i] == 'L') {
            coll++;
            if (colr > 0) {
                colr--;
            }
 
            // If value of coll is equal to
            // column then break
            if (coll == M) {
                break;
            }
        }
 
        // If current move is "R" then
        // increase the counter of colr
        else if (str[i] == 'R') {
            colr++;
            if (coll > 0) {
                coll--;
            }
 
            // If value of colr is equal to
            // column then break
            if (colr == M) {
                break;
            }
        }
 
        // If current move is "U" then
        // increase the counter of rowu
        else if (str[i] == 'U') {
            -rowu++;
            if (rowd > 0) {
                rowd--;
            }
 
            // If value of rowu is equal to
            // row then break
            if (rowu == N) {
                break;
            }
        }
 
        // If current move is "D" then
        // increase the counter of rowd
        else if (str[i] == 'D') {
            rowd++;
            if (rowu > 0) {
                rowu--;
            }
 
            // If value of rowd is equal to
            // row then break
            if (rowd == N) {
                break;
            }
        }
    }
 
    // If robot is within the bounds of the grid
    if (abs(rowd) < N && abs(rowu) < N
        && abs(coll) < M && abs(colr) < M) {
        return true;
    }
 
    // Unsafe
    return false;
}
 
// Driver code
int main()
{
    int N = 1, M = 1;
    string str = "R";
 
    if (isSafe(N, M, str))
        cout << "Yes";
    else
        cout << "No";
 
    return 0;
}


Java
// Java implementation of the approach
class GFG {
 
    // Function that returns true if the robot is safe
    static boolean isSafe(int N, int M, char[] str)
    {
 
        int coll = 0, colr = 0, rowu = 0, rowd = 0;
 
        for (int i = 0; i < str.length; i++) {
 
            // If current move is "L" then
            // increase the counter of coll
            if (str[i] == 'L') {
                coll++;
                if (colr > 0) {
                    colr--;
                }
 
                // If value of coll is equal to
                // column then break
                if (coll == M) {
                    break;
                }
            }
 
            // If current move is "R" then
            // increase the counter of colr
            else if (str[i] == 'R') {
                colr++;
                if (coll > 0) {
                    coll--;
                }
 
                // If value of colr is equal to
                // column then break
                if (colr == M) {
                    break;
                }
            }
 
            // If current move is "U" then
            // increase the counter of rowu
            else if (str[i] == 'U') {
                rowu++;
                if (rowd > 0) {
                    rowd--;
                }
 
                // If value of rowu is equal to
                // row then break
                if (rowu == N) {
                    break;
                }
            }
 
            // If current move is "D" then
            // increase the counter of rowd
            else if (str[i] == 'D') {
                rowd++;
                if (rowu > 0) {
                    rowu--;
                }
 
                // If value of rowd is equal to
                // row then break
                if (rowd == N) {
                    break;
                }
            }
        }
 
        // If robot is within the bounds of the grid
        if (Math.abs(rowd) < N && Math.abs(rowu) < N
            && Math.abs(coll) < M && Math.abs(colr) < M) {
            return true;
        }
 
        // Unsafe
        return false;
    }
 
    // Driver code
    public static void main(String[] args)
    {
        int N = 1, M = 1;
        String str = "R";
 
        if (isSafe(N, M, str.toCharArray()))
            System.out.println("Yes");
        else
            System.out.println("No");
    }
}
 
// This code is contributed by 29AjayKumar


Python3
# Python 3 implementation of the approach
 
# Function that returns true
# if the robot is safe
def isSafe(N, M, str):
    coll = 0
    colr = 0
    rowu = 0
    rowd = 0
 
    for i in range(len(str)):
         
        # If current move is "L" then
        # increase the counter of coll
        if (str[i] == 'L'):
            coll += 1
            if (colr > 0):
                colr -= 1
 
            # If value of coll is equal to
            # column then break
            if (coll == M):
                break
 
        # If current move is "R" then
        # increase the counter of colr
        elif (str[i] == 'R'):
            colr += 1
            if (coll > 0):
                coll -= 1
 
            # If value of colr is equal to
            # column then break
            if (colr == M):
                break
 
        # If current move is "U" then
        # increase the counter of rowu
        elif (str[i] == 'U'):
            rowu += 1
            if (rowd > 0):
                rowd -= 1
 
            # If value of rowu is equal to
            # row then break
            if (rowu == N):
                break
 
        # If current move is "D" then
        # increase the counter of rowd
        elif (str[i] == 'D'):
            rowd += 1
            if (rowu > 0):
                rowu -= 1
 
            # If value of rowd is equal to
            # row then break
            if (rowd == N):
                break
 
    # If robot is within the bounds of the grid
    if (abs(rowd) < N and abs(rowu) < N and
        abs(coll) < M and abs(colr) < M):
        return True
 
    # Unsafe
    return False
 
# Driver code
if __name__ == '__main__':
    N = 1
    M = 1
    str = "R"
 
    if (isSafe(N, M, str)):
        print("Yes")
    else:
        print("No")
 
# This code is contributed by
# Surendra_Gangwar


C#
// C# implementation of the approach
using System;
 
class GFG {
 
    // Function that returns true if the robot is safe
    static bool isSafe(int N, int M, char[] str)
    {
 
        int coll = 0, colr = 0, rowu = 0, rowd = 0;
 
        for (int i = 0; i < str.Length; i++) {
 
            // If current move is "L" then
            // increase the counter of coll
            if (str[i] == 'L') {
                coll++;
                if (colr > 0) {
                    colr--;
                }
 
                // If value of coll is equal to
                // column then break
                if (coll == M) {
                    break;
                }
            }
 
            // If current move is "R" then
            // increase the counter of colr
            else if (str[i] == 'R') {
                colr++;
                if (coll > 0) {
                    coll--;
                }
 
                // If value of colr is equal to
                // column then break
                if (colr == M) {
                    break;
                }
            }
 
            // If current move is "U" then
            // increase the counter of rowu
            else if (str[i] == 'U') {
                rowu++;
                if (rowd > 0) {
                    rowd--;
                }
 
                // If value of rowu is equal to
                // row then break
                if (rowu == N) {
                    break;
                }
            }
 
            // If current move is "D" then
            // increase the counter of rowd
            else if (str[i] == 'D') {
                rowd++;
                if (rowu > 0) {
                    rowu--;
                }
 
                // If value of rowd is equal to
                // row then break
                if (rowd == N) {
                    break;
                }
            }
        }
 
        // If robot is within the bounds of the grid
        if (Math.Abs(rowd) < N && Math.Abs(rowu) < N
            && Math.Abs(coll) < M && Math.Abs(colr) < M) {
            return true;
        }
 
        // Unsafe
        return false;
    }
 
    // Driver code
    public static void Main(String[] args)
    {
        int N = 1, M = 1;
        String str = "R";
 
        if (isSafe(N, M, str.ToCharArray()))
            Console.WriteLine("Yes");
        else
            Console.WriteLine("No");
    }
}
 
// This code has been contributed by 29AjayKumar


Javascript


输出:
No