程序员的算法趣题Q08:优秀的扫地机器人

4 篇文章 0 订阅

题目

现在市面上有很多扫地机器人,能够为我们分担家务,但是我们很难理解,有时候扫地机器人会重复清扫同一块地方。

  • 假设现在有一款扫地机器人,不会重复扫过的地方,如果它要走四步,在走了第一步后,移动三步有如下9种路径;
  • 第一步可以走4种路径,总共情况有 9*4=36 种路径。
    tZF7Vg.png
    思路:
  • 1.可以(0,0)来表示初始位置,每次可以有四个方向可以选择 上(1,0),下(-1,0),左(0,-1),右(0,1)
  • 2.用一个集合保存所有已经走过的位置,过滤重复走的位置

实现

public class FloormoppingRobot {

    private static int N = 12;
    //移动方向的列表,对应上下左右
    private static List<Position> step = new ArrayList<>(4);;

    static {
        step.add(new Position(0,1));
        step.add(new Position(0,-1));
        step.add(new Position(1,0));
        step.add(new Position(-1,0));
    }

    private static int move(List<Position> historyPos){
        //移动部署为N,则历史列表集合size为4时结束
        if( historyPos.size() == N + 1){
            return 1;
        }

        int cnt = 0;
        for( Position move : step ){
            //取出列表里最后一个元素
            int lastIndex = historyPos.size()-1;
            Position currentPosition = historyPos.get(lastIndex);

            //计算机器人下一步的位置
            Position nextPosition = new Position(currentPosition.x+move.x, currentPosition.y + move.y);

            if( !historyPos.contains(nextPosition) ){
                historyPos.add(nextPosition);
                cnt += move(historyPos);
                historyPos.remove(nextPosition);
            }
        }

        return cnt;
    }

    public static void main(String[] args) {
        List<Position> pos = new ArrayList<>();
        pos.add(new Position(0,0));

        List<Position> historyPos = new ArrayList<>();

        int cnt = move(pos);
        System.out.println(cnt);
    }

}

class Position {
    int x;
    int y;

    public Position(int x, int y) {
        this.x = x;
        this.y = y;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        Position position = (Position) o;
        return x == position.x &&
                y == position.y;
    }

    @Override
    public int hashCode() {
        return Objects.hash(x, y);
    }
}

资源地址

原书代码实现git库:https://github.com/allen1995/70-math-quizs-for-programmers

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值