深圳微信網(wǎng)站建設(shè)公司哪家好打廣告
面試題13. 機器人的運動范圍
難度:middle\color{orange}{middle}middle
題目描述
地上有一個 mmm 行 nnn 列的方格,從坐標 [0,0][0,0][0,0] 到坐標 [m?1,n?1][m-1,n-1][m?1,n?1] 。一個機器人從坐標 [0,0][0, 0][0,0] 的格子開始移動,它每次可以向左、右、上、下移動一格(不能移動到方格外),也不能進入行坐標和列坐標的數(shù)位之和大于 kkk 的格子。例如,當 kkk 為 18
時,機器人能夠進入方格 [35, 37] ,因為 3+5+3+7=18
。但它不能進入方格 [35, 38],因為 3+5+3+8=19
。請問該機器人能夠到達多少個格子?
示例 1:
輸入:m = 2, n = 3, k = 1
輸出:3
示例 2:
輸入:m = 3, n = 1, k = 0
輸出:1
提示:
- 1<=n,m<=1001 <= n,m <= 1001<=n,m<=100
- 0<=k<=200 <= k <= 200<=k<=20
算法
(BFS)
這是一個典型的寬度優(yōu)先搜索問題,我們從 (0, 0)
點開始,每次朝上下左右四個方向擴展新的節(jié)點即可。
擴展時需要注意新的節(jié)點需要滿足如下條件:
- 之前沒有遍歷過,這個可以用一個
bool
數(shù)組來判斷; - 沒有走出邊界;
- 橫縱坐標的各位數(shù)字之和小于
k
最后答案就是所有遍歷過的合法的節(jié)點個數(shù)。
復(fù)雜度分析
-
時間復(fù)雜度:每個節(jié)點最多只會入隊一次,所以時間復(fù)雜度不會超過方格中的節(jié)點個數(shù)。最壞情況下會遍歷方格中的所有點,所以時間復(fù)雜度就是 O(nm)O(nm)O(nm)
-
空間復(fù)雜度 : O(n)O(n)O(n)
C++ 代碼
class Solution {
public:// 求單個數(shù)字的各個位數(shù)之和int get_single_num(int x) {int s = 0;while (x) {s += x % 10;x /= 10;}return s;}//求一個方格的坐標位數(shù)之和int get_sum(pair<int, int> p) {return get_single_num(p.first) + get_single_num(p.second);}int movingCount(int m, int n, int k) {//m 行 n 列 threshhold -> kif (!k) return 1;if (!m || !n) return 0;int res = 0;vector<vector<bool>> st(m, vector<bool>(n));queue<pair<int, int>> q;q.push({0, 0});int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};while (q.size()) {auto t = q.front();q.pop();if (get_sum(t) > k || st[t.first][t.second]) continue;res ++;st[t.first][t.second] = true;for (int i = 0; i < 4; i ++) {int x = t.first + dx[i], y = t.second + dy[i];if (x >= 0 && x < m && y >= 0 && y < n)q.push({x, y});}}return res;}
};