A题我一开始想比较moves[i]与moves[i-2]来着,但是想想觉得太麻烦了。
注意到题目所给的数据都很小,不妨让机器人一步一步地走。

注意以下两点:

  1. 若前面还有没走过的格子,则不应该左转;
  2. 对于同一方向上的移动,特判moves[2]~move[4]:move[2]不能大于起点x;move[3]不能大于起点y;moves[4]不能超过x+moves[0],比如{1,2,3,4,5}返回-1。
/*7ms*/

const int dir[4][2] = {1, 0, 0, 1, -1, 0, 0, -1};
const int mx = 105;

bool vis[mx][mx], *tmp;

class RotatingBot
{
    public:
        int minArea(vector<int> mv)
        {
            int i, minx = 52, maxx = 52, miny = 52, maxy = 52, x = 52, y = 52;
            vis[x][y] = true;
            For(i, mv.size())
            {
                while (mv[i]--)
                {
                    if (*(tmp = &vis[x + dir[i & 3][0]][y + dir[i & 3][1]])) return -1;
                    *tmp = true;
                    x += dir[i & 3][0], y += dir[i & 3][1];
                }
                if (i < 4)
                {
                    minx = min(minx, x), maxx = max(maxx, x);
                    miny = min(miny, y), maxy = max(maxy, y);
                }
                if (!vis[x + dir[i & 3][0]][y + dir[i & 3][1]])
                {
                    /// 细心思考呀。。
                 if (i == 2 && i < mv.size() - 1 && x > minx) return -1;
                    if (i == 3 && i < mv.size() - 1 && y > miny) return -1;
                    if (i == 4 && (i < mv.size() - 1 && x != maxx || i == mv.size() - 1 && x > maxx)) return -1;
                    if (i > 4 && i < mv.size() - 1) return -1;
                }
            }
            return (maxx - minx + 1) * (maxy - miny + 1);
        }
};

Comments

comments powered by Disqus