这一步背后的直觉?

时间:2018-07-22 05:24:19

标签: c++ algorithm

我正在尝试通过今天早些时候举行的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时,在以下公式中添加31的直觉是什么?

dir=(dir+3)%4;
         ^?
dir=(dir+1)%4;
         ^?

谢谢!

编辑:如果为it==-2,则表示机器人向左移动;而如果it==-1则表示它向右移动。加上31如何确保方向改变

2 个答案:

答案 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::pairint[2]的位置,以及...

该代码是C ++和毫无意义的低级/不透明代码的奇怪组合。