机器人的运动范围

题目:

地上有一个 mm 行和 nn 列的方格,横纵坐标范围分别是 0m10∼m−1 和 0n10∼n−1

一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格

但是不能进入行坐标和列坐标的数位之和大于 kk 的格子

请问该机器人能够达到多少个格子?

 

题目分析:

这样的问题是一个搜索问题。每次向上下左右四个方向移动并判断是否满足,若满足,则结果加1

题目的判断条件是不能进入行坐标和列坐标的数位之和大于 kk 的格子

行坐标和列坐标的数位是横纵坐标各位相加之和,如(21, 31)的数位之和为 2 + 1 + 3 + 1 = 7

满足该条件后同时还需要行坐标与纵坐标合理,同时该元素未被访问

 

解决方案:

搜索可使用深度优先搜索或者广度优先搜索

深度优先搜索可使用栈实现,广度优先搜索可使用队列实现,使用深度优先搜索时,可能导致栈溢出,一般使用广度优先搜索

搜索时需要判断行坐标和列坐标的数位之和是否满足条件

数位之和的关键是将各个位上的数字拆开

若要将一个数的个十百千位分别拆开,可以用循环,每次对10取余再除以10即可

如果满足条件,再将横纵坐标合法的四个方向的数组压入队列之中

 

代码:

 1 class Solution {
 2 public:
 3     int get_single_sum(int num)
 4     {
 5         int sum = 0;
 6         while(num) sum += num % 10, num /= 10;
 7         return sum;
 8     }
 9     int get_sum(pair<int, int> index)
10     {
11         return get_single_sum(index.first) + get_single_sum(index.second);
12     }
13     int movingCount(int threshold, int rows, int cols)
14     {
15         queue<pair<int, int>> q;
16         vector<vector<bool>> st(rows, vector<bool>(cols));
17         int sum = 0;
18         q.push({0, 0});
19         
20         int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};
21         
22         while(q.size())
23         {
24             auto t = q.front();
25             q.pop();
26             
27             
28             if(get_sum(t) > threshold || st[t.first][t.second]) continue;
29             sum++;
30             st[t.first][t.second] = true;
31             for(int i = 0; i < 4; i++)
32             {
33                 int x = t.first + dx[i], y = t.second + dy[i];
34                 if(x >= 0 && x < rows && y >=0 && y < cols) q.push({x, y});
35             }
36         }
37         return sum;
38     }
39 };

 

posted @ 2019-05-31 06:53  roov  阅读(4)  评论(0编辑  收藏  举报