LeetCode-874. Walking Robot Simulation(模拟行走机器人)

模拟行走机器人

在这里插入图片描述

Walking Robot Simulation

在这里插入图片描述

C语言没有set,做起来可能有点麻烦
这里用到了二分查找,应该算不上贪心算法,就是简单的走一遍


int comp(const void *a, const void *b)
{
    return (*(int **)a)[0] - (*(int **)b)[0];
}

bool isStop(int x, int y, int **ob, int obs)//二分查找
{
    int left = 0, right = obs, mid = obs / 2;
    int a = x + y * 30000;

    if (!obs || a > ob[right - 1][0] || a < ob[0][0]){
        return true;
    }
    if (a == ob[mid][0]){
        return false;
    }

    while (left + 1 < right){
        if(a > ob[mid][0]) {
            left = mid;
            mid = (left + right) / 2;
        } else if (a < ob[mid][0]){
            right = mid;
            mid = (left + right) / 2;
        } else {
            return false;
        }
    }

    return true;
}

int turn(int a, int cmd)
{
    int b = a;

    switch(a) {
    case 0:
        if(cmd == -1) b = 1; else b = 3; break;
    case 1:
        if(cmd == -1) b = 2; else b = 0; break;
    case 2:
        if(cmd == -1) b = 3; else b = 1; break;
    case 3:
        if(cmd == -1) b = 0; else b = 2; break;
    default:
        break;
    }
    
    return b;
}

int robotSim(int* commands, int commandsSize, int** obstacles, int obstaclesSize, int* obstaclesColSize)
{
    int x = 0, y = 0, re = 0, i;
    int flag = 0;
    int t[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};

    for (i = 0; i < obstaclesSize; i++){
        obstacles[i][0] = obstacles[i][0] + obstacles[i][1] * 30000;
        //因为30000是obstacles的范围,障碍的纵坐标改变,新值以30000为单位变化,
        //因此,只要新值相等,原坐标必相同。
    }

    qsort(obstacles, obstaclesSize, sizeof(int *), comp);

    for (i = 0; i < commandsSize; i++){
        switch(commands[i]){
            case -1:
            case -2:
                flag = turn(flag, commands[i]);
                break;
            default:
                while(commands[i]--){
                    if(isStop(x+t[flag][0],y+t[flag][1],obstacles,obstaclesSize)){
                        x += t[flag][0];
                        y += t[flag][1];
                    }else{
                        break;
                    }
                }
                break;
        }

        re = re < x * x + y * y ? x * x + y * y : re;
    }

    //*obstaclesColSize = 2;

    return re;
}

结果
在这里插入图片描述
有点惨,等着有思路再优化吧…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值