宽度优先遍历 BFS

宽度优先遍历 BFS

1· 机器人的运动范围 (13 剑指offer )
  • 这道题 可以使用DFS 或 BFS 来求解, 但是DFS 可能会导致栈溢出, 所以这里选择BFS算法 + queue 的数据结构
  • 解题思路: 从左上角开始,BFS 遍历合法扩展没有遍历过的格子,最后所有遍历过的个数 就是合法的答案, 所以时间复杂度O(mn)所有格子的个数, 在C++ 中pointer 一秒可以遍历 1亿个 格子。
  • 这道题里的BFS 是 由queue 数据结构 来存储 坐标, 因为java 中不能直接 存放pair, 所以存放在 queue 里的 元素可以是数组。
public int movingCount(int threshold , int rows , int cols ){  
   if(rows <=0 || cols <= 0)
     return 0;
    int res = 0; 
   boolean [][] visited = new boolean [rows][cols];
   Queue<int[]> queue = new LinkedList<>();
   int[] dx = {-1, 0, 1, 0},  dy = {0, 1, 0, -1}; 
   queue.offer(new int[] {0,0});
   while( !queue.isEmpty()){
       int[] arr = queue.poll();
       if( get_sum_Digit(arr[0]) + get_sum_Digit(arr[1]) > threshold || arr[0] >= rows
           || arr[1] >= cols || arr[0] < 0 || arr[1] < 0 || visited[arr[0]][arr[1]] ) continue;
       res ++; 
       visited[arr[0]][arr[1]] = true; 
       for(int i=0; i<4; i++) {
           queue.offer(new int[]{ arr[0] + dx[i] , arr[1] +  dy[i]}); 
       }           
   }  /* while */
   return  res;
}

public int get_sum_Digit(int input) {
   int sum = 0;
   while(input != 0) {
     sum += input %10;
     input /= 10;
   }
 return  sum;
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一、动态规划 找到两点间的最短路径,找最匹配一组点的线,等等,都可能会用动态规划来解决。 参考如何理解动态规划中,...
    小碧小琳阅读 25,532评论 2 20
  • 做题,实际写出例子,然后分析可能遇到的情况,慢慢的,思路就会出来了。 线性表 33. Search in Rota...
    小碧小琳阅读 5,526评论 0 2
  • 更多干货就在我的个人博客 BlackBlog.tech 欢迎关注!也可以关注我的csdn博客:黑哥的博客谢谢大家!...
    BlackBlog__阅读 11,767评论 0 12
  • 1 其实就是求INF点到gate的最近曼哈顿距离 2 第一种方法是DFS:我们首先找到0的位置,每找到一个0,我们...
    云端漫步_b5aa阅读 4,551评论 0 0
  • 中午起床吃饭,然后一个下午都在玩兰斯10(虽然感觉并没有推进多少主线,果然读日语的速度还是不够快吗……)。虽然这游...
    真昼之月阅读 968评论 0 0

友情链接更多精彩内容