美文网首页
机器人的运动范围

机器人的运动范围

作者: UAV | 来源:发表于2020-06-24 07:23 被阅读0次

题目描述

地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
思路:使用回溯算法。创建数组记录访问状态,每次向上,下,左,右移动一个进行继续访问,检查每次进入方格是否满足条件,如满足条件则记录访问状态并进行下一步处理,如不满足条件则该分支提前结束。

class Solution {
public:
    int movingCount(int threshold, int rows, int cols)
    {
        if (threshold < 0 || rows <= 0 || cols <= 0) {
            return 0;
        }
        bool *visited = new bool[rows*cols];
        for (int i = 0; i <rows*cols; i++)
        {
            //二维数组这些结点未遍历
            visited[i] = false;
        }
        int result = moveCountCore(rows,cols,0,0,visited,threshold);
        delete[] visited;
        return result;

    }
    //判定是否满足回溯条件
    bool check(int rows,int cols,int row,int col,bool*visited,int threshold) {
        if (row >= 0
            && col >= 0
            && row < rows
            &&col < cols
            && visited[row*cols + col] == false
            && (dataBitSum(row) + dataBitSum(col) <= threshold)) {
        
            return true;
        }
        return false;
    }
    
    //控制机器人移动
    int moveCountCore(int rows, int cols, int row, int col, bool*visited, int threshold) {
        int count = 0;
        if (check(rows,cols,row,col,visited,threshold)) {
            //该格子未被访问,访问后下次不再遍历
            visited[row*cols + col] = true;
            
            count = 1 + moveCountCore(rows, cols, row - 1, col, visited, threshold)
                + moveCountCore(rows, cols, row, col + 1, visited, threshold)
                + moveCountCore(rows, cols, row + 1, col, visited, threshold)
                + moveCountCore(rows, cols, row - 1, col, visited, threshold);
        }
        return count;
        
    }


    //判别一个数字的各位数之和
    int dataBitSum(int data) {
        int sum=0;
        while (data != 0)
        {
            //如90
            sum = sum + data % 10;
            data = data / 10;
        }
        return sum;
    }
};

相关文章

  • 机器人运动范围

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

  • 机器人的运动范围

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

  • 机器人的运动范围

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

  • 机器人的运动范围

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

  • 机器人的运动范围

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

  • 机器人的运动范围

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

  • 机器人的运动范围

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

  • 机器人的运动范围

    记忆点 递归 从开始 思路 用递归。目标是从开始,找到所有的可以访问的点,所以理论上矩阵上的每个点最多访问一次。 实现

  • 机器人的运动范围

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

  • 机器人的运动范围

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

网友评论

      本文标题:机器人的运动范围

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