图的深度优先遍历和广度优先遍历
解题思路
关于图的深度优先遍历和广度优先遍历
为了标识出已经访问的路径,需要用到 hash
在DFS中需要记住如果能够访问 cnt=1
代码
class Solution {
public:
bool isRed(int x,int y,int k )
{
// std::cout << x/10 + x%10 + y/10 + y%10 <<" " ;
return x/10 + x%10 + y/10 + y%10 > k ;
// return (int(y/10) + (y%10)+int(x/10) + (x%10)>k ) ;
}
int dfs(int x,int y ,int width,int height, int k, std::vector<std::vector<int>>& visted )
{
if(x<0 || x>=width || y<0 || y >= height || visted[y][x] || isRed(x,y,k) ) return 0;
int cnt=1; //如果访问到则面积是1
visted[y][x] =1;
cnt += dfs(x-1,y,width,height,k ,visted);
cnt += dfs(x+1,y,width,height,k ,visted);
cnt += dfs(x,y-1,width,height,k ,visted);
cnt += dfs(x,y+1,width,height,k ,visted);
return cnt;
}
int bfs(int x,int y ,int width,int height, int k, std::vector<std::vector<int>>& visted )
{
std::deque<std::pair<int,int>> q;
q.emplace_back(x,y);
int res=0;
while(!q.empty())
{
auto node= q.front();q.pop_front();
int tX= node.first, tY= node.second;
// std::cout << tX <<" " << tY << std::endl;
if(tX<0 || tX>=width ||tY<0 || tY >= height || visted[tY][tX] || isRed(tX,tY,k) ) continue;
res++;
visted[tY][tX]= 1;
q.emplace_back(tX-1,tY);
q.emplace_back(tX+1,tY);
q.emplace_back(tX,tY-1);
q.emplace_back(tX,tY+1);
}
return res;
}
int movingCount(int m, int n, int k) {
// 0 <= x y <=99
//dfs retuen area
// end condition xy out of box, visted , isRed
// dfs(上下左右)
std::vector<std::vector<int>> visted(m,std::vector<int>(n,0) );
//return dfs(0,0,n,m, k,visted);
//bfs
return bfs(0,0,n,m, k,visted);
}
};
题目描述
剑指 Offer 13. 机器人的运动范围
地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为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 <= 100
0 <= k <= 20