解题:
1.使用queue实现广度优先搜索,定义方向数组
class Solution {
public:
int func(int x){
int sum=0;
while(x){
sum+=x%10;
x/=10;
}
return sum;
}
int movingCount(int m, int n, int k) {
if(k==0) return 1;
queue<pair<int,int>> q;
int dx[2]={0,1};
int dy[2]={1,0};
vector<vector<int>> vis(m,vector<int>(n,0));
q.push(make_pair(0,0));
vis[0][0]=1;
int count=1;
while(!q.empty()){
auto [x,y]=q.front();
q.pop();
for(int i=0;i<2;i++){
int tx=x+dx[i];
int ty=y+dy[i];
if(tx<0||tx>=m||ty<0||ty>=n||vis[tx][ty]||func(tx)+func(ty)>k) continue;
q.push(make_pair(tx,ty));
count++;
vis[tx][ty]=1;
}
}
return count;
}
};
2.递归实现DFS
class Solution {
public:
int movingCount(int m, int n, int k) {
vector<vector<int>> vis(m,vector(n,0));
int count=0;
dfs(count,0,0,m,n,k,vis);
return count;
}
int func(int x){
int sum=0;
while(x){
sum+=x%10;
x/=10;
}
return sum;
}
void dfs(int &count,int x,int y,int m,int n,int k,vector<vector<int>>&vis){
if(x>=m||x<0||y>=n||y<0||func(x)+func(y)>k||vis[x][y]) return;
count++;
vis[x][y]=1;
dfs(count,x+1,y,m,n,k,vis);
dfs(count,x,y+1,m,n,k,vis);
}
};