LeetCode·每日一题·874. 模拟行走机器人·哈希

作者:小迅
链接:https://leetcode.cn/problems/walking-robot-simulation/solutions/2350184/ha-xi-biao-zhu-shi-chao-ji-xiang-xi-by-x-20cg/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

题目LeetCode·每日一题·874. 模拟行走机器人·哈希_第1张图片

 

示例LeetCode·每日一题·874. 模拟行走机器人·哈希_第2张图片

 

思路

题目给出一个在点 (0, 0) ,并面向北方的机器人。现在有一个大小为 n 的命令数组 commands 来操作机器人的移动,和一个大小为 m 的障碍物数组 obstacles。现在我们通过 commands 来模拟机器人的移动,并用一个哈希表来存储每一个障碍物放置点。当机器人的指令为向前移动时,我们尝试往前移动对应的次数——若往前一个单位不为障碍物放置点(即不在哈希表中),则机器人向前移动一个单位,否则机器人保持原位不变。

在机器人移动的过程中记录从原点到机器人所有经过的整数路径点的最大欧式距离的平方即为最后的答案。

在代码实现的过程中,对于机器人转向和向前移动的操作,我们可以用一个方向数组 dirs={[−1,0],[0,1],[1,0],[0,−1]} 来现实。若当前机器人的坐标为 (x,y),当前方向的标号为 d,则往前移动一单位的操作为 x=x+dirs[d][0],y=y+dirs[i][1]。向左转的操作为 d=(d+3)mod4,向右转的操作为 d=(d+1)mod4。

代码注释超级详细

代码


typedef struct {//哈希结构
    int key;
    UT_hash_handle hh;
} HashItem; 

HashItem *hashFindItem(HashItem **obj, int key) {
    HashItem *pEntry = NULL;
    HASH_FIND_INT(*obj, &key, pEntry);//查询哈希表中key是否存在
    return pEntry;
}

bool hashAddItem(HashItem **obj, int key) {
    if (hashFindItem(obj, key)) {
        return false;
    }
    HashItem *pEntry = (HashItem *)malloc(sizeof(HashItem));
    pEntry->key = key;
    HASH_ADD_INT(*obj, key, pEntry);//将key存到哈希表中
    return true;
}

void hashFree(HashItem **obj) {
    HashItem *curr = NULL, *tmp = NULL;
    HASH_ITER(hh, *obj, curr, tmp) {//销毁哈希表
        HASH_DEL(*obj, curr);  
        free(curr);
    }
}

int robotSim(int* commands, int commandsSize, int** obstacles, int obstaclesSize, int* obstaclesColSize) {
    int dirs[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
    int px = 0, py = 0, d = 1;
    HashItem *mp = NULL;
    for (int i = 0; i < obstaclesSize; i++) {//将路障加入哈希表
        hashAddItem(&mp, obstacles[i][0] * 60001 + obstacles[i][1]);
    }
    int res = 0;
    for (int i = 0; i < commandsSize; i++) {//枚举操作,进行模拟
        int c = commands[i];
        if (c < 0) {//转弯
            d += c == -1 ? 1 : -1;
            d %= 4;
            if (d < 0) {
                d += 4;
            }
        } else {//直行
            for (int i = 0; i < c; i++) {//直行c步
                //每一步都判断当前位置是否有路障
                if (hashFindItem(&mp , (px + dirs[d][0]) * 60001 + py + dirs[d][1])) {
                    break;
                }
                px += dirs[d][0];//无路障直行
                py += dirs[d][1];
                res = fmax(res, px * px + py * py);//记录距离最大值
            }
        }
    }
    hashFree(&mp);
    return res;
}


作者:小迅
链接:https://leetcode.cn/problems/walking-robot-simulation/solutions/2350184/ha-xi-biao-zhu-shi-chao-ji-xiang-xi-by-x-20cg/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(LeetCode刷题笔记,leetcode,机器人,哈希算法)