给定一个大小为NXM的网格,并在单元(N – 1,M – 1)处放置了一个机器人。同样,给定的字符串str仅由字符“ U” (上), “ D” (下), “ L” (左)和“ R” (右)组成,代表机器人将在网格中执行的动作。任务是查找机器人在最后移动结束后是否安全。如果机器人在网格范围之内,则可以说是安全的。
注意:请考虑在数字线下方存在矩形网格,并且左上角位于原点上。
例子:
Input: N = 1, M = 1, str = “R”
Output: No
As there is only 1 cell, no movement is allowed.
Input: N = 2, M = 3, str = “LLRU”
Output: Yes
方法:对于每一步,更新机器人在网格内的位置。如果机器人在任何移动位置都在网格之外,则输出为“否”。如果对于所有移动,机器人都在网格的边界内,则输出“是”。
下面是上述方法的实现:
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