我正在尝试通过今天早些时候举行的LeetCode竞赛解决a question:
位于无限网格上的机器人从点(0,0)开始并面向北。机器人可以接收以下三种可能的命令之一:
-2
:向左转90度
-1
:向右转90度
1
<= x <=9
:向前移动x个单位
某些网格正方形是障碍。第i个障碍物位于网格点(障碍物[i] [0],障碍物[i] [1])。如果机器人尝试在其上移动,则机器人将停留在先前的网格正方形上(但仍沿其余路线继续。)返回机器人将最大欧几里得距离的平方来自原点。
高度接受的解决方案如下:
typedef pair<int, int> ii;
const int d[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
class Solution {
public:
int robotSim(vector<int>& commands, vector<vector<int>>& obstacles) {
set<ii> A;
for (auto& it : obstacles) {
A.insert({it[0], it[1]});
}
int dir = 0, x = 0, y = 0;
int ret = 0;
for (auto& it : commands) {
if (it == -2) {
dir = (dir + 3) % 4;
} else if (it == -1) {
dir = (dir + 1) % 4;
} else {
for (int k = 0; k < it; ++k) {
int nx = x + d[dir][0];
int ny = y + d[dir][1];
if (A.count({nx, ny})) break;
x = nx;
y = ny;
}
}
ret = max(ret, x * x + y * y);
}
return ret;
}
};
我的问题是,在计算dir
时,在以下公式中添加3
和1
的直觉是什么?
dir=(dir+3)%4;
^?
dir=(dir+1)%4;
^?
谢谢!
编辑:如果为it==-2
,则表示机器人向左移动;而如果it==-1
则表示它向右移动。加上3
和1
如何确保方向改变?
答案 0 :(得分:3)
方向定义为:
0 | 3 ------- 1 | 2
开始时您要面对北方(// this variable is just for type checking
const z: TypedLeaves<number> = x;
)
如果您想右转(即-90度),则需要面对“ 1”,即0 + 1(dir = 0
)
如果您想向左走(即+90度),则需要面对“ 3”,
就是0 + 3(dir+1
)
就是这样!希望我足够清楚,祝你好运;)
答案 1 :(得分:1)
dir=(dir+3)%4
从概念上讲是dir=(dir-1)%4
-这两个表达式只是实现了++
和--
,但是将结果保留在[0, 4)
中,因为这是d
数组。
old new
0 3
1 0
2 1
3 2
如果将dir
声明为enum Dir { N, E, S, W };
,并且将对dir
的更改进行函数调用,并编写类似valarray的对类,那将更加清楚。 std::pair
和int[2]
的位置,以及...
该代码是C ++和毫无意义的低级/不透明代码的奇怪组合。