文章目录
题目
代码(7.27 首刷看解析)
设映射后的数字为kx+y,我们想知道k为多少时不会发生碰撞。当碰撞时kx1+y1=kx2+y2,解出来k=(y2-y1)/(x1-x2),由于x,y的取值范围为[-30000,30000],那么k的取值范围为[-60000,60000],这个范围内的值都可能碰撞,比如k=60000时,(1,-30000)和(0,30000)算出来都是30000。
除了以上,还要去想上下左右下标变换。
嗯,很有意思的一个题。
class Solution {
public:
int robotSim(vector<int>& commands, vector<vector<int>>& obstacles) {
int dirs[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
unordered_set<int> mp;
for(auto& o : obstacles) {
mp.emplace(o[0]*60001 + o[1]);
}
int res = 0;
int px = 0, py = 0, d = 1;
for(int c : commands) {
if(c < 0) {
d += c == -1 ? 1 : -1; // 右(k+1)%4 左(k+3)%4 这个是dirs的下标
d %= 4;
if(d < 0)
d += 4;
} else {
for(int i = 0; i < c; i++) {
if(mp.count((px + dirs[d][0]) * 60001 + py + dirs[d][1])) // 是否碰到障碍物
break;
px += dirs[d][0];
py += dirs[d][1];
res = max(res, px*px+py*py);
}
}
}
return res;
}
};