基本思路:要到达一个点首先需要它四周有点可到达,然后才是它自己满足条件,可以想到基本框架用BFS搜索。然后,这个点自己需要满足的条件如下:
- 它在规定的行坐标和列坐标范围内:在队列添加下一个点时简单判断即可
- 它的行列各位数之和小于等于threshold:在队列添加下一个点时加和判断即可
- 它不能被重复计数:用哈希表存储已统计过的点,因为哈希表没有内置的对pair的哈希算法,所以需要自己实现(当然用vector自己实现也可以)
class Solution {
public:
struct pair_hash {
inline size_t operator()(const pair<int,int> & p) const {
return p.first * 101 + p.second;
}
};
unordered_set<pair<int, int>, pair_hash> hash;
vector<vector<int>> neigh = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
bool judge(int x, int y, int rows, int cols, int threshold) {
if (!(x >= 0 && x < rows && y >= 0 && y < cols)) return false;
int res = 0;
while (x) {
res += x % 10;
x /= 10;
}
while (y) {
res += y % 10;
y /= 10;
}
return res <= threshold;
}
int movingCount(int threshold, int rows, int cols) {
int res = 0;
queue<pair<int, int>> q;
q.emplace(0, 0);
hash.insert(make_pair(0, 0));
while (!q.empty()) {
auto now = q.front();
res++;
q.pop();
for (auto &i: neigh) {
int x = now.first + i[0], y = now.second + i[1];
if (judge(x, y, rows, cols, threshold) && !hash.count(make_pair(x, y))) {
q.emplace(x, y);
hash.insert(make_pair(x, y));
}
}
}
return res;
}
};

京公网安备 11010502036488号