文章目录
- 系列文章目录
- 一、一般性矩阵寻多种最短路径问题
- 传送门:各种迷宫寻路径问题(一)_躺平的小智的博客-CSDN博客
- 二、一般性迷宫问题 加强版
- 传送门:各种迷宫寻路径问题(二)_躺平的小智的博客-CSDN博客
- 三、一般性迷宫问题 加强版(二)
- 传送门:各种迷宫寻路径问题(三)_躺平的小智的博客-CSDN博客
- 四、有障碍,任意走的基础迷宫最短路径问题
- 传送门:各种迷宫问题(四)_躺平的小智的博客-CSDN博客
- 五、矩阵中寻找特殊元素路径
- 传送门:各种迷宫问题(五)_躺平的小智的博客-CSDN博客
- 六、矩阵中寻找特殊元素路径(二)
- 传送门:各种迷宫问题(六)_躺平的小智的博客-CSDN博客
- 七、美团力扣周赛
- 传送门:美团迷宫问题_躺平的小智的博客-CSDN博客
- 八、滴滴秋招笔试题
- 传送门:滴滴迷宫笔试题_躺平的小智的博客-CSDN博客
六、矩阵中寻找固定元素的路径(二)
和五(一)类似,只不过此题我们没有办法用原有矩阵中的值表示访问过得元素,我们创建一个二维数组vis来记录这个点是否访问过,这题我们用广度优先深度优先各做一遍。
dfs代码如下:
class Solution {
public:
int step;
int sum(int x){
int s = 0;
while(x!=0){
s +=x%10;
x = x/10;
}
return s;
}
void dfs(int m,int n,int k,int i,int j,vector<vector<bool>>& vis){
if(i>=m||i<0||j>=n||j<0||(sum(i)+sum(j))>k||!vis[i][j]) return;
step++;
vis[i][j]= false;
dfs(m,n,k,i+1,j,vis);
dfs(m,n,k,i,j+1,vis);
}
int movingCount(int m, int n, int k) {
vector<vector<bool>> vis(m,vector<bool>(n,true));
step = 0;
dfs(m,n,k,0,0,vis);
return step;
}
};
每走一步我们需要用step记录一下走过的次数,来充当能够到达的方块数量。
bfs代码如下:
class Solution {
public:
int step;
int sum(int x){
int s = 0;
while(x!=0){
s +=x%10;
x = x/10;
}
return s;
}
int movingCount(int m, int n, int k) {
vector<vector<bool>> vis(m,vector<bool>(n,true));
queue<vector<int>>q;
q.push({0,0,0,0});
int step = 0;
while(!q.empty()){
int size = q.size();
for(int i = 0;i<size;++i){
vector<int> x = q.front();
int s1 = x[0],s2=x[1],s3=sum(x[0]),s4=sum(x[1]);
if((s3+s4)>k||s1>=m||s1<0||s2>=n||s2<0||!vis[s1][s2]) continue;
step++;
vis[s1][s2]=false;
q.push({s1+1,s2,s3,s4});
q.push({s1,s2+1,s3,s4});
}
q.pop();
}
return step;
}
};