leetcode-1041. 困于环中的机器人
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 = Falsepre = 'D'for i in range(4):for j in range(n):c = instructions[j]if c == 'G':if pre == 'D':start[1] += 1elif pre == 'A':start[1] -= 1elif pre == 'W':start[0] += 1elif pre == 'S':start[0] -= 1else: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 = Truebreakreturn resif __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 ++;elsestart_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';elsepre = c=='L'?'A':'D';}}if(start_x == 0 && start_y == 0){res = true;break;}}return res;
}
执行结果如下: