力扣 剑指 Offer 13. 机器人的运动范围
超时代码
原因在于判断一个点多调用了两次fun函数。
class Solution {
public:
struct node {
int x, y;
};
int dir[2][2] = { {0,1},{1,0}};
int fun(int x) {
int ans = 0;
while (x != 0) {
ans += x % 10;
x /= 10;
}
return ans;
}
int movingCount(int m, int n, int k) {
vector<vector<int>> vis(m, vector<int>(n, 0));
queue < node> q;
q.push({ 0,0 });
int count = 0;
while (!q.empty()) {
node now = q.front();
q.pop();
if (fun(now.x)+fun(now.y) <= k&&vis[now.x][now.y]==0) {
count++;
vis[now.x][now.y] = 1;
}
for (int i = 0; i < 2; i++) {
int nx = now.x + dir[i][0];
int ny = now.y + dir[i][1];
if (nx>=0&&nx<=m-1&&ny>=0&&ny<=n-1&&vis[nx][ny] == 0&& fun(nx)+fun(ny) <= k) {
q.push({ nx,ny });
}
}
}
return count;
}
};
修改可以通过代码
class Solution {
public:
struct node {
int x, y;
};
int dir[2][2] = { {0,1},{1,0} };
int fun(int x) {
int ans = 0;
while (x != 0) {
ans += x % 10;
x /= 10;
}
return ans;
}
int movingCount(int m, int n, int k) {
vector<vector<int>> vis(m, vector<int>(n, 0));
queue < node> q;
q.push({ 0,0 });
int count = 0;
while (!q.empty()) {
node now = q.front();
q.pop();
if (fun(now.x) + fun(now.y) <= k && vis[now.x][now.y] == 0) {
count++;
vis[now.x][now.y] = 1;
for (int i = 0; i < 2; i++) {
int nx = now.x + dir[i][0];
int ny = now.y + dir[i][1];
if (nx >= 0 && nx <= m - 1 && ny >= 0 && ny <= n - 1 && vis[nx][ny] == 0) {
q.push({ nx,ny });
}
}
}
}
return count;
}
};
模仿官方代码
class Solution {
public:
struct node {
int x, y;
};
int dir[2][2] = { {0,1},{1,0}};
int fun(int x) {
int ans = 0;
while (x != 0) {
ans += x % 10;
x /= 10;
}
return ans;
}
int movingCount(int m, int n, int k) {
vector<vector<int>> vis(m, vector<int>(n, 0));
queue < node> q;
q.push({ 0,0 });
vis[0][0] = 1;
int count = 1;
while (!q.empty()) {
node now = q.front();
q.pop();
for (int i = 0; i < 2; i++) {
int nx = now.x + dir[i][0];
int ny = now.y + dir[i][1];
if (nx<0 || nx>m - 1 || ny<0 || ny>n - 1 || vis[nx][ny] == 1 || fun(nx) + fun(ny) > k) continue;
q.push({ nx,ny });
count++;
vis[nx][ny] = 1;
}
}
return count;
}
};