【java刷算法】牛客—剑指offer4DFS与BFS两种思路的碰撞,一起来练习



import java.util.*;



public class Solution {

    /**

     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可

     *

     * 

     * @param matrix char字符型二维数组 

     * @param word string字符串 

     * @return bool布尔型

     */

   public boolean hasPath(char[][] matrix, String word) {

    char[] words = word.toCharArray();

    for (int i = 0; i < matrix.length; i++) {

        for (int j = 0; j < matrix[0].length; j++) {

            //从[i,j]这个坐标开始查找

            if (dfs(matrix, words, i, j, 0))

                return true;

        }

    }

    return false;

}

 

boolean dfs(char[][] matrix, char[] word, int i, int j, int index) {

    //边界的判断,如果越界直接返回false。index表示的是查找到字符串word的第几个字符,

    //如果这个字符不等于matrix[i][j],说明验证这个坐标路径是走不通的,直接返回false

    if (i >= matrix.length || i < 0 || j >= matrix[0].length || j < 0 || matrix[i][j] != word[index])

        return false;

    //如果word的每个字符都查找完了,直接返回true

    if (index == word.length - 1)

        return true;

    //把当前坐标的值保存下来,为了在最后复原

    char tmp = matrix[i][j];

    //然后修改当前坐标的值

    matrix[i][j] = '.';

    //走递归,沿着当前坐标的上下左右4个方向查找

    boolean res = dfs(matrix, word, i + 1, j, index + 1)

            || dfs(matrix, word, i - 1, j, index + 1)

            || dfs(matrix, word, i, j + 1, index + 1)

            || dfs(matrix, word, i, j - 1, index + 1);

    //递归之后再把当前的坐标复原

    matrix[i][j] = tmp;

    return res;

}

}



在这里插入图片描述

JZ13 机器人的运动范围

=============================================================================

题目描述


在这里插入图片描述

在这里插入图片描述

思路详解


本题是一个机器人从左上角开始,他可以沿着上下左右四个方向走,并且走到的每个格子坐标的数字和不大于k,问可以走多少个格子。那么就想到本题就有两种解法,DFS 和 BFS,下面都列出来大家看下效率和具体实现方法。

DFS(深度优先搜索)

根据题目得出,机器人不能往回走,并且每个格子还有一个进入的方向,那么机器人可以走的就只有3个方向。但是我们用的是DFS(深度优先搜索),就像不撞南墙不回头的牛一样。实际上只有向右,向下,两个方向。

我们试想一下,他会一直沿着一个方向走到不能走,然后回溯。那么这个时候回溯的时候我们在进行向下,向右,就可以达到所有的地方。

详解见代码哦!!!

BFS(广度优先搜索)

当然也可以用BFS(广度优先搜索),相比于DFS,BFS就比较灵活咯。

BFS不是一条道走下去,他会把离他最近的都访问一遍,访问完之后才开始访问第二近的……,直到访问完全部的。

BFS使用最好的一种数据结构就是使用队列,因为队列是先进先出,离他最近的访问完之后加入到队列中,最先入队的也是最先出队的。

具体代码与DFS相差不多,详见代码注释哦!!!

代码与结果


DFS(深度优先搜索)


public int movingCount(int threshold, int rows, int cols) {

    //临时变量visited记录格子是否被访问过

    boolean[][] visited = new boolean[rows][cols];

    return dfs(0, 0, rows, cols, threshold, visited);

}

 

public int dfs(int i, int j, int rows, int cols, int threshold, boolean[][] visited) {

    //i >= rows || j >= cols是边界条件的判断,threshold < sum(i, j)判断当前格子坐标是否

    // 满足条件,visited[i][j]判断这个格子是否被访问过

    if (i >= rows || j >= cols || threshold < sum(i, j) || visited[i][j])

        return 0;

    //标注这个格子被访问过

    visited[i][j] = true;

    //沿着当前格子的右边和下边继续访问

    return 1 + dfs(i + 1, j, rows, cols, threshold, visited) +

            dfs(i, j + 1, rows, cols, threshold, visited);

}

 


**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
![img](https://img-blog.csdnimg.cn/img_convert/e8511e6e6eadcd60187fe760ee176075.jpeg)
![img](https://img-blog.csdnimg.cn/img_convert/265a34cd77a33a84e164240c8fbdeaf8.png)
![img](https://img-blog.csdnimg.cn/img_convert/3e8ba0279a2cee038d51488a607f54e3.png)
![img](https://img-blog.csdnimg.cn/img_convert/d5bd3385fad6fdce21283ba2cfee2b5f.png)
![img](https://img-blog.csdnimg.cn/img_convert/bf38df64df8165ba1d54623c55d9f394.png)
![img](https://img-blog.csdnimg.cn/img_convert/a581e5fb0d16a457634e435e203b853c.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!**

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**

**如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)**
![img](https://img-blog.csdnimg.cn/img_convert/2c977451021eb0ce97ca7cbfcb086867.jpeg)



# 最后

整理的这些资料希望对Java开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

![image](https://img-blog.csdnimg.cn/img_convert/27ae516e5404e6a80fc067c4a45b2bad.webp?x-oss-process=image/format,png)

![image](https://img-blog.csdnimg.cn/img_convert/48f4c9bd3af72870fac91eb6dfbe3a24.webp?x-oss-process=image/format,png)

其实面试这一块早在第一个说的25大面试专题就全都有的。以上提及的这些全部的面试+学习的各种笔记资料,我这差不多来回搞了三个多月,收集整理真的很不容易,其中还有很多自己的一些知识总结。正是因为很麻烦,所以对以上这些学习复习资料感兴趣


[**一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!**](https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0)

**AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算**

.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0)

**AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算**

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值