美文网首页
面试题13:机器人移动

面试题13:机器人移动

作者: 繁星追逐 | 来源:发表于2019-08-16 11:01 被阅读0次
  • 地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。
    • 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?

思路:还是对回溯法的应用,方格中统计满足条件的位置个数。采用递归依次遍历上下左右是否满足条件,满足的话统计变量加1,创建标记矩阵去标记是否被访问。
检查的条件包括该位置没有越界,大于等于0,没有被访问过,以及行列每位数字之和不大于k。满足条件则递归上上下左右的坐标加上本次符合条件的1。最后返回次数。

代码如下:

public class RobotMove {
    /**
     * 地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。
     * 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
     */



    /**
     *
     * @param threshold
     * @param rows
     * @param cols
     * @return
     */
    public int movingCount(int threshold, int rows, int cols)
    {
        if (rows<=0 || cols<=0 || threshold<0){
            return 0;
        }
        //构造一个标志矩阵
        boolean[] marked = new boolean[rows*cols];
        // boolean [][] isState= new boolean [rows][cols];
        return move(0,0,threshold,rows,cols,marked);
    }

    /**
     * 统计符合条件的位置个数
     *判断该位置没有出界的情况下,验证是否符合总和小于k值
     * 小于改变标志位,并进行下沿判断,
     * 不符合则返回累加的个数
     * @param row
     * @param col
     * @param threshold
     * @param rows
     * @param cols
     * @param marked
     * @return
     */
    private int move(int row, int col, int threshold, int rows, int cols, boolean[] marked) {
        int count=0;
        int index=row*cols+col;
       if (check(row,col,threshold,rows,cols,marked,index)){
           marked[index] = true;
           count = move(row-1,col,threshold,rows,cols,marked) + move(row+1,col,threshold,rows,cols,marked) + move(row,col-1,threshold,rows,cols,marked) + move(row,col+1,threshold,rows,cols,marked) + 1;

       }
       return count;
    }

    /**
     * 验证出界和k值以及标志位
     * @param row
     * @param col
     * @param threshold
     * @param rows
     * @param cols
     * @param marked
     * @param index
     * @return
     */
    private boolean check(int row, int col, int threshold, int rows, int cols, boolean[] marked,int index) {
        return row>=0 && row<rows && col>=0 && col<cols && !marked[index] && digitSum(row)+digitSum(col)<=threshold;
    }

    /**
     * 计算该数的每一位的数字和
     * @param number
     * @return
     */
    private int digitSum(int number) {
         int sum=0;
         while (number>0){
             sum+=number%10;
             number/=10;
         }
         return sum;
    }

    public static void main(String[] args) {
        System.out.println(395/100);
    }
}

相关文章

  • 面试题13:机器人移动

    地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是...

  • 机器人的运动范围

    《剑指offer》面试题13:矩阵中的路径 题目:地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动...

  • 面试题13: 机器人移动范围

  • 【直通BAT】剑指Offer-经典试题整理(2)

    13 机器人的运动范围 题目描述 地上有一个 m 行和 n 列的方格。 一个机器人从坐标 0,0 的格子开始移动,...

  • 剑指offer第二版-13.机器人的运动范围(回溯法)

    本系列导航:剑指offer(第二版)java实现导航帖 面试题13:机器人的运动范围 题目要求:地上有一个m行n列...

  • 移动机器人避障方法 你知道多少?

    移动机器人是机器人的重要研究领域,人们很早就开始移动机器人的研究。 世界上第一台真正意义上的移动机器人是斯坦福研究...

  • Robot OS系统架构设计

    1. 背景 目前移动机器人已得到了大范围应用,无论是在大型商场还是银行都可以看到移动机器人身影。移动机器人主要是移...

  • 移动机器人路径规划实现

    近年来,移动机器人的研究受到了人们的高度重视,人们对于机器人的要求不再局限于简单的移动,而是希望机器人能够根据周围...

  • 移动机器 人

    移动机器人是全国最早发明的机器人。移动机器人有很大的力气。能帮人搬货。有人十分喜爱他,他可以弯腰.握手.跳舞.表演杂技。

  • A*算法详解

    引子 我们讨论一个移动机器人遇到问题:如何移动到指定位置 首先,移动机器人需要有一个地图,同时知道自己现在在哪儿,...

网友评论

      本文标题:面试题13:机器人移动

      本文链接:https://www.haomeiwen.com/subject/lvffsctx.html