机器人的运动范围
题目:
地上有一个 mm 行和 nn 列的方格,横纵坐标范围分别是 0∼m−10∼m−1 和 0∼n−10∼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 };