(笔试)机器人的运动范围

题目:

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

思路:

题目求的是机器人能够达到多少个格子,并不是能走多少格子,因此不是一个路径的问题,如题目说的求的是运动范围。

1、递归

机器人每到一个位置,判断该位置是否有效,如果有效(是否在方格里,是否已经访问过,是否大于k),往左右上下移动,重复上述行为,最终遍历的范围就是运动的范围。

2、非递归

将递归转为非递归,可以用栈或者队列实现,这里并没有遍历的先后顺序,因此队列也是OK的。

代码:

1、递归实现

class Solution {
public:
    void getMovingCount(int r,int c,int rows,int cols,int &count,vector<bool> &visited,int threshold){
        if(r<0 || r>=rows || c<0 || c>=cols || visited[r*cols+c]==true || getNum(r,c)>threshold)
            return;
        visited[r*cols+c]=true;
        count++;
        getMovingCount(r-1,c,rows,cols,count,visited,threshold);
        getMovingCount(r+1,c,rows,cols,count,visited,threshold);
        getMovingCount(r,c-1,rows,cols,count,visited,threshold);
        getMovingCount(r,c+1,rows,cols,count,visited,threshold);
    }
    int movingCount(int threshold, int rows, int cols){
        vector<bool> visited(rows*cols);
        int count=0;
        getMovingCount(0,0,rows,cols,count,visited,threshold);
        return count;
    }
    int getNum(int r,int c){
        int sum=0;
        while(r){
            sum+=r%10;
            r=r/10;
        }
        while(c){
            sum+=c%10;
            c=c/10;
        }
        return sum;
    }
};

2、队列、栈的非递归实现

struct node {
    int x, y;
    node(int xx,int yy):x(xx),y(yy){}
};
class Solution {
private:
    int d[4][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} };
public:
    int movingCount(int threshold, int rows, int cols) {
        if(threshold<0)
            return 0;
        vector<bool> visited(rows*cols,false);
        int sum = 1;
        node s(0,0);
//        s.x = s.y = 0;
        queue<node> q;
        q.push(s);
        visited[0] = true;
        while(!q.empty()) {
            node tmp = q.front();
            q.pop();

            for(int i = 0; i < 4; i ++) {
                s.x = tmp.x + d[i][0];
                s.y = tmp.y + d[i][1];
                int index = s.x*cols + s.y;
                if(s.x < 0 || s.x >= rows || s.y < 0 || s.y >= cols || visited[index]==true) continue;

                if(getNum(s.x,s.y) <= threshold) {
                    sum++;
                    visited[index] = true;
                    q.push(s);
                }
            }
        }
        return sum;
    }
    int getNum(int r,int c){
        int sum=0;
        while(r){
            sum+=r%10;
            r=r/10;
        }
        while(c){
            sum+=c%10;
            c=c/10;
        }
        return sum;
    }
};
struct node {
    int x, y;
    node(int xx,int yy):x(xx),y(yy){}
};
class Solution {
private:
    int d[4][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} };
public:
    int movingCount(int threshold, int rows, int cols) {
        if(threshold<0)
            return 0;
        vector<bool> visited(rows*cols,false);
        int sum = 1;
        node s(0,0);
//        s.x = s.y = 0;
        stack<node> q;
        q.push(s);
        visited[0] = true;
        while(!q.empty()) {
            node tmp = q.top();
            q.pop();

            for(int i = 0; i < 4; i ++) {
                s.x = tmp.x + d[i][0];
                s.y = tmp.y + d[i][1];
                int index = s.x*cols + s.y;
                if(s.x < 0 || s.x >= rows || s.y < 0 || s.y >= cols || visited[index]==true) continue;

                if(getNum(s.x,s.y) <= threshold) {
                    sum++;
                    visited[index] = true;
                    q.push(s);
                }
            }
        }
        return sum;
    }
    int getNum(int r,int c){
        int sum=0;
        while(r){
            sum+=r%10;
            r=r/10;
        }
        while(c){
            sum+=c%10;
            c=c/10;
        }
        return sum;
    }
};
时间: 2024-10-13 21:54:19

(笔试)机器人的运动范围的相关文章

机器人的运动范围-剑指Offer

机器人的运动范围 题目描述 地上有一个m行和n列的方格.一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子. 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18.但是,它不能进入方格(35,38),因为3+5+3+8 = 19.请问该机器人能够达到多少个格子? 思路 这个跟“矩阵中的路径”那个题很相似,都是使用回溯法,不过这个题的起点是固定的,就是从(0,0)位置开始走 我们同样根据行

机器人的运动范围

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

剑指offer(六十六)之机器人的运动范围

题目描述 地上有一个m行和n列的方格.一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子. 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18.但是,它不能进入方格(35,38),因为3+5+3+8 = 19.请问该机器人能够达到多少个格子? 代码: <span style="color:#000099;">import java.util.*; public c

[剑指Offer] 66.机器人的运动范围

题目描述 地上有一个m行和n列的方格.一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子. 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18.但是,它不能进入方格(35,38),因为3+5+3+8 = 19.请问该机器人能够达到多少个格子? [思路]DFS 1 class Solution { 2 public: 3 int flag[1000][1000]; 4 int sum(i

66机器人的运动范围

题目描述 地上有一个m行和n列的方格.一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子. 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18.但是,它不能进入方格(35,38),因为3+5+3+8 = 19.请问该机器人能够达到多少个格子? 思路 与上题类似: 机器人从左边(0,0)开始移动,当它准备进入(i,j)的格子时候,通过检查坐标的数位和来判断机器人是否能够进入.如果机器人能

剑指offer:机器人的运动范围

题目描述地上有一个m行和n列的方格.一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子. 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18.但是,它不能进入方格(35,38),因为3+5+3+8 = 19.请问该机器人能够达到多少个格子? class Solution: def movingCount(self, threshold, rows, cols): # 判断(row, c

AcWing&#160;24.&#160;机器人的运动范围

习题地址 https://www.acwing.com/solution/acwing/content/2970/ 题目描述地上有一个 m 行和 n 列的方格,横纵坐标范围分别是 0∼m−1 和 0∼n−1. 一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格. 但是不能进入行坐标和列坐标的数位之和大于 k 的格子. 请问该机器人能够达到多少个格子? 样例 输入:k=7, m=4, n=5 输出:20 输入:k=18, m=40, n=40 输出:1484 解释:当

剑指offer66:机器人的运动范围

1 题目描述 地上有一个m行和n列的方格.一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子. 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18.但是,它不能进入方格(35,38),因为3+5+3+8 = 19.请问该机器人能够达到多少个格子? 2 思路和方法 第一步:创建一个行为rows,列为cols的bool型数组,用来标记走过的位置,初始化为false,true表示走过. 第二

[acwing#24]机器人的运动范围(BFS-DFS)

题目来源:https://www.acwing.com/problem/content/22/ 地上有一个 m 行和 n 列的方格,横纵坐标范围分别是 0-m?1 和 0-n?1. 一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格. 但是不能进入行坐标和列坐标的数位之和大于 k 的格子. 请问该机器人能够达到多少个格子? 样例1 输入:k=7, m=4, n=5 输出:20 样例2 输入:k=18, m=40, n=40 输出:1484 解释:当k为18时,机器人