剑指 Offer 12. 矩阵中的路径

剑指 Offer 12. 矩阵中的路径

推荐写法

把判断条件都写在dfs函数开头(对节点进行处理,尽量不要对边进行处理)

写法一

class Solution {boolean[][] vis;public boolean exist(char[][] board, String word) {int m = board.length, n = board[0].length;vis = new boolean[m][n];for(int i = 0; i < m; i++){for(int j = 0; j < n; j++){if(dfs(board, i, j, word, 0)) return true;}}return false;}boolean dfs(char[][] board, int x, int y, String word, int ind){if(x < 0 || x >= board.length || y < 0 || y >= board[0].length || vis[x][y] || board[x][y] != word.charAt(ind)) return false;if(ind == word.length() - 1) return true;vis[x][y] = true;if(dfs(board, x + 1, y, word, ind + 1)) return true;if(dfs(board, x - 1, y, word, ind + 1)) return true;if(dfs(board, x, y + 1, word, ind + 1)) return true;if(dfs(board, x, y - 1, word, ind + 1)) return true;vis[x][y] = false;return false;}
}

写法二

for循环

class Solution {int[][] dir = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};boolean[][] vis;public boolean exist(char[][] board, String word) {int m = board.length, n = board[0].length;vis = new boolean[m][n];for(int i = 0; i < m; i++){for(int j = 0; j < n; j++){if(dfs(board, i, j, word, 0)) return true;}}return false;}boolean dfs(char[][] board, int x, int y, String word, int ind){int m = board.length, n = board[0].length;if(x < 0 || x >= m || y < 0 || y >= n || vis[x][y] || board[x][y] != word.charAt(ind)) return false;if(ind == word.length() - 1) return true;vis[x][y] = true;for(int i = 0; i < dir.length; i++){int nx = x + dir[i][0];int ny = y + dir[i][1];if(dfs(board, nx, ny, word, ind + 1)) return true;}vis[x][y] = false;return false;}
}

之前写法

解法一和解法二 vis数组 写法不同。

解法一处理的是节点,即进入该节点后,更改当前节点的访问状态。

解法二处理的是,即进入该节点前,更改即将进入节点的访问状态。

需要注意的是,两种写法不要混淆。

解法一

class Solution {int[][] dir = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};boolean[][] vis;public boolean exist(char[][] board, String word) {int m = board.length, n = board[0].length;vis = new boolean[m][n];for(int i = 0; i < m; i++){for(int j = 0; j < n; j++){if(backtrack(board, i, j, word, 0)) return true;}}return false;}boolean backtrack(char[][] board, int x, int y, String word, int ind){int m = board.length, n = board[0].length;if(board[x][y] != word.charAt(ind)) return false;if(ind == word.length() - 1) return true;vis[x][y] = true;for(int i = 0; i < dir.length; i++){int nx = x + dir[i][0];int ny = y + dir[i][1];if(nx < 0 || nx >= m || ny < 0 || ny >= n || vis[nx][ny]) continue;if(backtrack(board, nx, ny, word, ind + 1)) return true;}vis[x][y] = false;return false;}
}

解法二

class Solution {int[][] dir = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};boolean[][] vis;public boolean exist(char[][] board, String word) {int m = board.length, n = board[0].length;vis = new boolean[m][n];for(int i = 0; i < m; i++){for(int j = 0; j < n; j++){vis[i][j] = true;if(backtrack(board, i, j, word, 0)) return true;vis[i][j] = false;}}return false;}boolean backtrack(char[][] board, int x, int y, String word, int ind){int m = board.length, n = board[0].length;if(board[x][y] != word.charAt(ind)) return false;if(ind == word.length() - 1) return true;for(int k = 0; k < dir.length; k++){int nx = x + dir[k][0];int ny = y + dir[k][1];if(nx < 0 || nx >= m || ny < 0 || ny >= n || vis[nx][ny]) continue;vis[nx][ny] = true;if(backtrack(board, nx, ny, word, ind + 1)) return true;vis[nx][ny] = false;}return false;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/74502.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浅谈redis未授权漏洞

redis未授权漏洞 利用条件 版本比较高的redis需要修改redis的配置文件&#xff0c;将bind前面#注释符去掉&#xff0c;将protected-mode 后面改为no 写入webshell config get dir #查看redis数据库路径 config set dir web路径# #修改靶机Redis数据库路径 config set dbfilen…

QT QTabWidget 控件 使用详解

本文详细的介绍了QTabWidget控件的各种操作&#xff0c;例如&#xff1a;新建界面、设置页面名字、设置提示信息、设置页面激活、设置标题栏位置、设置页面关闭按钮、设置页面关闭按钮、获取页面下标、获取页面总数、清空所有页面、删除某个页面、设置拖拽移动、设置显示页面、…

【Spring容器的启动流程】

Spring容器的启动流程主要分为以下几个步骤&#xff1a; 加载配置文件&#xff1a;Spring容器会从指定的配置文件中读取配置信息&#xff0c;包括bean的定义、依赖关系、AOP切面等。 创建容器&#xff1a;Spring容器启动后会创建一个容器实例&#xff0c;容器负责管理bean的生…

MyBatis-Plus排除不必要的字段

查询学生信息排除年龄列表 &#x1f4da;&#x1f50d; 使用MyBatis-Plus排除某些字段。如果你想要进行查询&#xff0c;但又不需要包含某些字段&#xff0c;那么这个功能将非常适合你。&#x1f50d;&#x1f393;&#x1f4dd; 1. 学生信息查询-排除年龄列表 在使用 MyBat…

【计算机网络】HTTP(下)

本文承接上文的代码进行改造&#xff0c;上文链接&#xff1a;HTTP上 文章目录 1. 实现网站跳转实现 自己的网站跳转 2. 请求方法(get) && 响应方法(post)GET方法POST方法GET与POST的应用场景 3. HTTP状态码在自己设计的代码中发现4043开头的状态码(重定向状态码)永久…

一种基于注意机制的快速、鲁棒的混合气体识别和浓度检测算法,配备了具有双损失函数的递归神经网络

A fast and robust mixture gases identification and concentration detection algorithm based on attention mechanism equipped recurrent neural network with double loss function 摘要 提出一个由注意力机制组成的电子鼻系统。首先采用端到端的编码器译码器&#xff…

容器编排学习(二)镜像制作和私有仓库介绍

一 Dockerfile 1 概述 commit的局限 很容易制作简单的镜像&#xff0c;但碰到复杂的情况就十分不方便例如碰到下面的情况需要设置默认的启动命令需要设置环境变量需要指定镜像开放某些特定的端口 Dockerfile就是解决这些问题的方法 Dockerfile是一种更强大的镜像制作方式…

VMware虚拟机+Centos7 配置静态,动态IP

本章目录 一、查看网关&#xff1a; 编辑–>虚拟网络编辑器二、点击NAT设置三、记住网关IP待会要用四、配置静态ip地址1、进入存放修改IP地址的目录2、修改ip地址的文件3、编辑文件4、文件&#xff08;编辑好后退出&#xff09; 五、重启网络六、测试1、linux上查看IP地址的…

爬虫爬取mp3文件例子

相信训练模型时数据集的获取也是一个很头疼的事情&#xff0c;搞cv领域的可以扛着摄像头架起三脚架拍摄获取&#xff08;以前干过&#xff09;&#xff0c;但是如果是nlp领域的呢&#xff0c;特别是chatgpt等大模型出来后对这类文本等数据的需求更大&#xff0c;如果没有现成的…

【AIGC专题】Stable Diffusion 从入门到企业级实战0403

一、前言 本章是《Stable Diffusion 从入门到企业级实战》系列的第四部分能力进阶篇《Stable Diffusion ControlNet v1.1 图像精准控制》第03节&#xff0c; 利用Stable Diffusion ControlNet Canny模型精准控制图像生成。本部分内容&#xff0c;位于整个Stable Diffusion生态…

JavaScript 数组中常用的方法

添加 push&#xff1a;数组末尾添加unshift&#xff1a;数组首位添加splice(1, 0, ‘新增内容’)&#xff1a;再指定位置插入&#xff0c;第二参数为0&#xff0c;表示新增&#xff1b;大于0&#xff0c;表示修改 删除 pop&#xff1a;删除末尾shift&#xff1a;删除首位slice(…

安全学习DAY23_CookieSessionToken

文章目录 Cookie和Session的区别Token的作用 Cookie和Session的区别 Cookie和Session都是用来在Web应用程序中跟踪用户状态的机制 1、存储位置不同&#xff1a; Cookie是存储在客户端&#xff08;浏览器&#xff09;上的&#xff0c;而Session是存储在服务器端的。 2、安全…

王道数据结构编程题 二叉树

二叉树定义 以下为本文解题代码的二叉树定义。 struct TreeNode {int val;TreeNode* left, *right;TreeNode(int val 0, TreeNode* left nullptr, TreeNode* right nullptr): val(val), left(left), right(right) {} };非递归后序遍历 题目描述 编写后序遍历二叉树的非递…

网络编程day6——基于C/S架构封装的线程池

一、线程竞争基本概念 竞争与同步 同一个进程中的线程共享进程中的绝大多数资源&#xff0c;当它们随意竞争时可能会导致资源被破坏、脏数据、不完整问题 通过一些手段让线程在竞争资源时相互协调、避免出现以上问题&#xff0c;这就称为线程同步 原子操作&#xff1a; 操作过程…

第16节-PhotoShop基础课程-修复工具组-去水印

文章目录 前言1.污点修复画笔1.功能原理2.调整1.调整大小 Alt 右键 左右2.调整软硬 Alt 右键 上下 2.修复画笔工具 Alt 选取源1.常规2.选择图案 3.修补工具1.类型1.源2.目标 2.扩展 4.内容感知移动工具5.红眼工具 前言 去水印等 1.污点修复画笔 比如把下面的土豆&#xff08…

Scrum敏捷模式的优势点、实践经验及适用企业

Scrum敏捷模式是一种灵活、适应性强的开发方法&#xff0c;其核心理念是以短周期、高频率的方式进行项目开发&#xff0c;确保团队能够快速响应变化。 Scrum包含三个角色&#xff1a;产品负责人&#xff08;Product Owner&#xff09;、Scrum Master和开发团队&#xff08;Tea…

【程序员装机】Windows常见问题解决指南

文章目录 前言从专业版升级到企业版禁用Y空间的录制IDM扩展失效Edge浏览器安装CRX扩展 总结 前言 本文将介绍如何将Windows操作系统中的专业版升级为企业版&#xff0c;以及一些与系统和应用程序相关的常见问题的解决方法。 从专业版升级到企业版 如果您希望将专业版的Window…

【交叉熵损失torch.nn.CrossEntropyLoss详解-附代码实现】

CrossEntropyLoss 什么是交叉熵softmax损失计算验证CrossEntropyLoss 输入输出介绍验证代码 什么是交叉熵 交叉熵有很多文章介绍&#xff0c;此处不赘述。只需要知道它是可以衡量真实值和预测值之间的差距的&#xff0c;因而用交叉熵来计算损失的时候&#xff0c;损失是越小越…

详解TCP/IP协议第一篇:网络基础知识

文章目录 写给自己的话 一:前言 1:手握金刚钻的TCP/IP 2:计算机中的协议 3:分组

深入了解HTTP代理的工作原理

HTTP代理是一种常见的网络代理方式&#xff0c;它可以帮助用户隐藏自己的IP地址&#xff0c;保护个人隐私和安全。了解HTTP代理的工作原理对于使用HTTP代理的用户来说非常重要。本文将深入介绍HTTP代理的工作原理。 代理服务器的作用 HTTP代理的工作原理基于代理服务器的作用。…