楼主: rhwfyf
跳转到指定楼层
上一主题 下一主题
收起左侧

[其他] google 扫地机器人

 
🔗
Ostrichi 2018-3-9 09:10:31 | 只看该作者
全局:
class robot{. ----
   
    int[] pos;
    Set<String> visited;
    Stack<int[]> stack;
    Stack<Integer> actions;

    robot(){
        pos = new int[]{0, 0};
        visited = new HashSet<>();
        stack = new Stack<>();. ----
        stack.push(new int[]{0,0,0});
        actions = new Stack<>();
    }

    private boolean move(){}

    private void turnLeft(){}
. Χ
    private void turnRight(){}. 1point3acres

    private boolean moveF(){. ----
        boolean succ = move();
        if(succ)
            pos[1]++;. check 1point3acres for more.
        return succ;. Χ
    }

    private boolean moveL(){
        turnLeft(1);. 1point3acres.com
        boolean succ = move();
        if(succ). Χ
            pos[0]--;
        turnRight(1);
        return succ;
    }

    private boolean moveR(){
        turnRight(1);
        boolean succ = move();
        if(succ). check 1point3acres for more.
            pos[0]++;
        turnLeft(1);
        return succ;
    }. 1point3acres
. 1point3acres
    private boolean moveB(){
        turnLeft(2);
        boolean succ = move();
        if(succ)
            pos[1]--;. 1point3acres
        turnRight(2);
        return succ;
    }

    private boolean moveNext(int x){ ..
        if(x == 0) return moveF();
        else if(x == 1) return moveR();
        else if(x == 2) return moveB();
        else if(x == 3) return moveL();
        return false;
    }

    private void Return(int x){
        if(x == 0) moveB();
        else if(x == 1) moveL();
        else if(x == 2) moveF();
        else if(x == 3) moveR();
    }. check 1point3acres for more.


    private void clean(){}

    private void traverse(){. 1point 3acres
        while(!stack.isEmpty()){
            int[] cur = stack.peek();. .и
            int x = cur[0], y = cur[1];
. 1point3acres.com             
            if(!visited(posStr(cur[0], cur[1]))){. 1point 3acres
                visited.add(posStr(cur[0], cur[1]));
                clean();
            }

            String[] nextPoint = new String[]{posStr(cur[0], cur[1]+1),posStr(cur[0]+1, cur[1]),
                        posStr(cur[0], cur[1]-1),posStr(cur[0]-1, cur[1])};

            while(cur[2] < 4 && (visited.contains(nextPoint(cur[2])) || !moveNext(cur[2])))
                cur[2]++;. 1point3acres.com

            if(cur[2] == 4){
                stack.pop();.google  и
                while(!stack.isEmpty() && !(pos[0] == stack.peek()[0] && pos[1] == stack.peek()[1])){
                    Return(actions.pop());. Waral dи,
                }. ----
            }else{
                cur[2]++;
                stack.push(new int[]{pos[0], pos[1], 0});. Χ
            }. ----
        }
    }.
}
. 1point 3acres


评分

参与人数 4大米 +12 收起 理由
高渐离击筑高歌 + 5 给你点个赞!
liushaobo + 3 很有启发
rhwfyf + 3 给你点个赞!
bowenzh + 1 给你点个赞!

查看全部评分

回复

使用道具 举报

🔗
Ostrichi 2018-3-9 09:11:06 | 只看该作者
全局:
递归比这个简单
回复

使用道具 举报

🔗
siy 2018-3-9 09:24:57 | 只看该作者
全局:
我面试面了这道题最后过了。我是dfs,用一个set记录visited。设定起点是原点,dfs helper函数要传机器人当前方向,用0123表示就可以。每一个helper函数用for循环走四次。每一次按照顺时针或者逆时针转一下。把走过的坐标和cannot move的点都放进visited。最重要的是走完发现无路可走之后要再转向后方走一步再转向后,也就是返回上级helper函数时机器人所在的位置和面朝的方向。

评分

参与人数 8大米 +36 收起 理由
yangruirui421 + 5 给你点个赞!
yabay91 + 5 很有用的信息!
greenroses + 3 给你点个赞!
abcdldzy + 4 给你点个赞!
jaychsu + 3 很有用的信息!

查看全部评分

回复

使用道具 举报

🔗
siy 2018-3-9 09:28:39 | 只看该作者
全局:
我面试的时候小哥说我是他面过的第一个把这道题题和followup都做完的candidate。难点在于一是包了api进去要手动控制方向,二是要参数具体化这个房间。
回复

使用道具 举报

🔗
 楼主| rhwfyf 2018-3-9 11:41:23 | 只看该作者
全局:
siy 发表于 2018-3-9 09:24.
我面试面了这道题最后过了。我是dfs,用一个set记录visited。设定起点是原点,dfs helper函数要传机器人当 ...

谢谢分享。能不能分享一下代码呢?我来研究研究,多谢!
回复

使用道具 举报

🔗
anywho 2018-3-9 11:48:46 | 只看该作者
全局:
这题需要注意的点 楼里有人已经说得很详细了 就是dfs+自己定义一种方式hash已经走过的格子+手动在递归函数结束时调整机器人的方向的位置

重点就是自己写一遍 然后跑test case  光看别人的代码 很容易忽略里面的细节
回复

使用道具 举报

🔗
cszhazha 2018-3-9 11:50:01 | 只看该作者
全局:
我记得难点就是递归的时候方向转换的问题
回复

使用道具 举报

🔗
greynut 2018-3-9 14:33:06 | 只看该作者
全局:
siy 发表于 2018-3-9 09:28.--
我面试的时候小哥说我是他面过的第一个把这道题题和followup都做完的candidate。难点在于一是包了api进去要 ...

嗯嗯 谢谢你贡献思路 我自己写过一次 我的思路就是每次递归结束后保证返回上一个格子并且方向也保持一致 可惜面试没有看到
回复

使用道具 举报

🔗
 楼主| rhwfyf 2018-3-10 01:09:42 | 只看该作者
全局:
siy 发表于 2018-3-9 09:24
我面试面了这道题最后过了。我是dfs,用一个set记录visited。设定起点是原点,dfs helper函数要传机器人当 ...

差不多是这个意思?. Waral dи,

void dfs(x, y, back_direction) {
    if(visited(x, y))
        return;

    visited.add(x,y);. check 1point3acres for more.
    .1point3acres
    if(move(UP))        dfs(x, y - 1, DOWN);
    if(move(LEFT))     dfs(x - 1, y, RIGHT);
    if(move(DOWN))   dfs(x, y + 1, UP);
    if(move(RIGHT))   dfs(x + 1, y, LEFT);. From 1point 3acres bbs

    move(back_direction);
}
回复

使用道具 举报

🔗
siy 2018-3-10 02:48:45 | 只看该作者
全局:
rhwfyf 发表于 2018-3-10 01:09
差不多是这个意思?. 1point 3 acres

void dfs(x, y, back_direction) {

差不多。但是api给的是顺时针转逆时针转。所以四个if里面应该是转0次1次2次3次。然后cannot move的点是房间边界或者障碍物。也要加进visited
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表