题:https://leetcode.com/problems/robot-bounded-in-circle/
题目大意
给定一个机器人,初始位置为(0,0) ,初始方向 为 北,机器人执行一段指令 S。
S 由三种命令组成 ,“G” (直走)、“L”(左转 90度)、 “R”(右转 90度)。
求若执行 S 若干次(1次或多次),机器人的轨迹是否为一个圆。
思路
若执行 S 若干次,机器人的轨迹是一个圈。那么定有最小次数 使得 机器人的轨迹为 圈。
换句话说,若机器人的轨迹是一个圈,那么存在k, 使得重复 k 次 执行 S 后,机器人能回到原始状态,即 初始位置为(0,0) ,初始方向 为 北。
那么 k 是多少?我们从方向的角度来考虑。
每次执行 S 后,机器人的方向会较原方向转移一个角度。
若转移角度为0,那么执行 1 次 后,此时机器人的位置必须为(0,0)。否则,每次执行S后,机器人的位置必发生偏移且方向向北。
若转移角度为180,那么执行 2 次 后,此时机器人的位置必为(0,0)。否则,每2次执行S后,机器人的位置必发生偏移且方向向北。
同理 若转移角度为左或右 90度,那么执行 4 次 后,此时机器人的位置必为(0,0)。
因此 k<=4,即 我们 对 S 最多执行4次,若 4 次中,机器人能回到初始状态,那么机器人执行若干次指令S,机器人的轨迹为圈。
总结下, k 是 机器人只能左、右转动 90度 决定的。
class Solution {
int[][] dirs = {{0,1},{1,0},{0,-1},{-1,0}};
public boolean isRobotBounded(String instructions) {
int[] curPos = {0,0};
int dir = 0;
int t = 4;
while(t-->0){
for(char c:instructions.toCharArray()){
if(c == 'G'){
curPos[0] += dirs[dir][0];
curPos[1] += dirs[dir][1];
}else if(c == 'R'){
dir = (dir+1)%4;
}else{
dir = (dir-1 + 4)%4;
}
}
if(curPos[0] == 0 && curPos[1] == 0 && dir == 0)
return true;
}
return false;
}
}