leetcode-1041. 困于环中的机器人
- 1. 算法题目
- 2 . 实现思路
- 3. 参考代码
1. 算法题目
题目如下:
在无限的平面上,机器人最初位于 (0, 0) 处,面朝北方。注意:
- 北方向 是y轴的正方向。
- 南方向 是y轴的负方向。
- 东方向 是x轴的正方向。
- 西方向 是x轴的负方向。
机器人可以接受下列三条指令之一:
- “G”:直走 1 个单位
- “L”:左转 90 度
- “R”:右转 90 度
机器人按顺序执行指令 instructions,并一直重复它们。
只有在平面中存在环使得机器人永远无法离开时,返回 true。否则,返回 false。
示例如下:
示例1:
输入:instructions = "GGLLGG"
输出:true
解释:机器人最初在(0,0)处,面向北方。
“G”:移动一步。位置:(0,1)方向:北。
“G”:移动一步。位置:(0,2).方向:北。
“L”:逆时针旋转90度。位置:(0,2).方向:西。
“L”:逆时针旋转90度。位置:(0,2)方向:南。
“G”:移动一步。位置:(0,1)方向:南。
“G”:移动一步。位置:(0,0)方向:南。
重复指令,机器人进入循环:(0,0)——>(0,1)——>(0,2)——>(0,1)——>(0,0)。
在此基础上,我们返回true。
示例2:
输入:instructions = "GG"
输出:false
解释:机器人最初在(0,0)处,面向北方。
“G”:移动一步。位置:(0,1)方向:北。
“G”:移动一步。位置:(0,2).方向:北。
重复这些指示,继续朝北前进,不会进入循环。
在此基础上,返回false。
示例3:
输入:instructions = "GL"
输出:true
解释:机器人最初在(0,0)处,面向北方。
“G”:移动一步。位置:(0,1)方向:北。
“L”:逆时针旋转90度。位置:(0,1).方向:西。
“G”:移动一步。位置:(- 1,1)方向:西。
“L”:逆时针旋转90度。位置:(- 1,1)方向:南。
“G”:移动一步。位置:(- 1,0)方向:南。
“L”:逆时针旋转90度。位置:(- 1,0)方向:东方。
“G”:移动一步。位置:(0,0)方向:东方。
“L”:逆时针旋转90度。位置:(0,0)方向:北。
重复指令,机器人进入循环:(0,0)——>(0,1)——>(- 1,1)——>(- 1,0)——>(0,0)。
在此基础上,我们返回true。
2 . 实现思路
思路:根据题目要求,其实就是求机器人在经过有限次一样的指令变化下能回到初始点(0,0)吗?仔细琢磨可以发现,机器人要想回到初始点(0,0),要么经过第一次指令变化之后就已经回到初始点[1],要么经过两次一样的指令变化之后回到初始点[2],要么经过四次一样的指令变化之后回到初始点[3]。其他情况下(不考虑重复回到初始点的情况),机器人无论如何都无法回到初始点(0,0).
[1]第一种情况
(0,0)->(0,1)->(0,2)向右变化
(0,0)<-(0,1)<-(0,2)向右变化
[2]第二种情况
第一次变化
(0,0)->(0,1)->(0,2)向右变化2次
第二次变化
向右变化2次(0,0)(0,1)<-(0,2)
[3]第三种情况
1.
(0,0)->(0,1)向右变化
2.
(0,1)
向下
(1,1)
向右变化
3
向右变化(1,0)<-(1,1)
4.
(0,0)
向上
(1,0)
3. 参考代码
参考代码如下:
Python实现
class Solution(object):
def isRobotBounded(self, instructions):
"""
:type instructions: str
:rtype: bool
"""
n = len(instructions)
start = [0,0]
res = False
pre = 'D'
for i in range(4):
for j in range(n):
c = instructions[j]
if c == 'G':
if pre == 'D':
start[1] += 1
elif pre == 'A':
start[1] -= 1
elif pre == 'W':
start[0] += 1
elif pre == 'S':
start[0] -= 1
else:
if pre == 'D':
pre = 'W' if c == 'L' else 'S'
elif pre == 'A':
pre = 'S' if c == 'L' else 'W'
elif pre == 'S':
pre = 'A' if c == 'R' else 'D'
else:
pre = 'A' if c == 'L' else 'D'
if start[0] == 0 and start[1] == 0:
res = True
break
return res
if __name__ == '__main__':
a = Solution()
instructions = "GG"
print(a.isRobotBounded(instructions))
C语言实现
bool isRobotBounded(char * instructions){
bool res = false;
int n = strlen(instructions);
int start_x = 0 ,start_y = 0;
char pre = 'D',c;
for(int i=0;i<4;i++)
{
for(int j=0;j<n;j++)
{
c = instructions[j];
if(c == 'G')
{
if(pre=='D')
start_x ++;
else if(pre=='A')
start_x --;
else if(pre=='S')
start_y ++;
else
start_y --;
}
else
{
if(pre=='D')
pre = c=='L'?'W':'S';
else if(pre == 'A')
pre = c == 'L'?'S':'W';
else if(pre == 'S')
pre = c=='R'?'A':'D';
else
pre = c=='L'?'A':'D';
}
}
if(start_x == 0 && start_y == 0)
{
res = true;
break;
}
}
return res;
}
执行结果如下: