> 文章列表 > leetcode-1041. 困于环中的机器人

leetcode-1041. 困于环中的机器人

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;
}

执行结果如下:
leetcode-1041. 困于环中的机器人
leetcode-1041. 困于环中的机器人