1. 二维网格图中探测环
    给你一个二维字符网格数组 grid ,大小为 m x n ,你需要检查 grid 中是否存在 相同值 形成的环。

一个环是一条开始和结束于同一个格子的长度 大于等于 4 的路径。对于一个给定的格子,你可以移动到它上、下、左、右四个方向相邻的格子之一,可以移动的前提是这两个格子有 相同的值 。

同时,你也不能回到上一次移动时所在的格子。比方说,环 (1, 1) -> (1, 2) -> (1, 1) 是不合法的,因为从 (1, 2) 移动到 (1, 1) 回到了上一次移动时的格子。

如果 grid 中有相同值形成的环,请你返回 true ,否则返回 false 。

示例 1:

输入:grid = [[“a”,“a”,“a”,“a”],[“a”,“b”,“b”,“a”],[“a”,“b”,“b”,“a”],[“a”,“a”,“a”,“a”]]
输出:true
解释:如下图所示,有 2 个用不同颜色标出来的环:

示例 2:

输入:grid = [[“c”,“c”,“c”,“a”],[“c”,“d”,“c”,“c”],[“c”,“c”,“e”,“c”],[“f”,“c”,“c”,“c”]]
输出:true
解释:如下图所示,只有高亮所示的一个合法环:

示例 3:

输入:grid = [[“a”,“b”,“b”],[“b”,“z”,“b”],[“b”,“b”,“a”]]
输出:false

提示:

m == grid.length
n == grid[i].length
1 <= m <= 500
1 <= n <= 500
grid 只包含小写英文字母。

分析:看到题意就知道是个搜索题,但如何判断环?这是解决本题的核心问题。
其实仔细想想,只要我下一个访问的节点并不是上一个节点,并且和当前节点的字符相同,不就符合环的定义吗?并不需要一定是一个完整的环,在搜索的半路找到了环就足以解题。 所以我们要记录下上一个节点,不必判断是否回到了起点。
保存上一个节点可以把行列下表都记录下来,还有一个方法,就是把二维网格标号,那么每个位置的标号不就唯一了,唯一就可以判断是否是上一个点,于是我们把x,y坐标转化成一个唯一标号就可以判断是否是上一个节点了。用唯一标识去判断上一个点的好处是,减小了空间并能防止两个点判断相等时的错误,比如我要判断这两个点是否相等:x!=x’&&y!=y’对吗?这里中间要用||才对,只要一个参数不同就是不同的点了,减小了犯逻辑错误的可能。这个题目还有一个陷阱,就是关于如何剪枝的问题,因为我们不可能对每一个节点都去搜索,这样的搜索空间过于庞大,而搜索过的字符一定dfs都已经搜索过,根据图论,如果一个图中存在环,无论无门从哪个位置走一定能找到一个环!所以这里我们尽可标记访问过的点就好,连续的字符搜索一遍就够了,不必恢复现场,因为要剪枝搜索过程中我只要保证不继续搜索上一个节点就可以了,访问过的节点大可不必绕开走
本题刚开始想很好想,但容易落入深搜的陷阱,记录一下。

class Solution {public:int book[510][510];int row,col,pre,dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};bool judge(int s,int e,int step,vector<vector<char>>& grid,int pre){if(book[s][e]&&step>3)return 1;book[s][e]=1;for(int i=0;i<4;i++){int ts = s+dir[i][0];int te = e+dir[i][1];if(te>=0&&ts>=0&&ts<row&&te<col&&grid[s][e]==grid[ts][te]&&pre!=ts*row+te){if(judge(ts,te,step+1,grid,s*row+e))return 1;}}return 0;}bool containsCycle(vector<vector<char>>& grid) {col = grid[0].size();row = grid.size();res=0;for(int i=0;i<row&&!res;i++){for(int j=0;j<col&&!res;j++){if(!book[i][j]&&judge(i,j,1,grid,-1))return 1;}}return 0;}
};```

Leetcode 1559二维网格图中探测环 技巧DFS|剪枝相关推荐

  1. Matlab 二维网格图pcolor和imagesc区别

    Matlab 二维网格图pcolor和imagesc区别 在速度或者衰减层析成像反演之后会得到地下介质每个网格点的速度/衰减值,在进行呈现的时候可以使用maltab的pcolor和imagesc进行二 ...

  2. LeetCode 1260. 二维网格迁移

    LeetCode 1260. 二维网格迁移 给你一个 m 行 n 列的二维网格 grid 和一个整数 k.你需要将 grid 迁移 k 次. 每次「迁移」操作将会引发下述活动: 位于 grid[i][ ...

  3. LeetCode 1260. 二维网格迁移(二维转一维)

    1. 题目 给你一个 n 行 m 列的二维网格 grid 和一个整数 k.你需要将 grid 迁移 k 次. 每次「迁移」操作将会引发下述活动: 位于 grid[i][j] 的元素将会移动到 grid ...

  4. 可完全分离的二维矢量图加密域鲁棒可逆水印算法(一)

    摘要 随着云制造技术的兴起,加密域可逆水印技术逐渐受到了较多的关注.然而,现有的大部分算法不仅只能应用于图像.视频等冗余性较大的载体,而且难以抵御常见的攻击,甚至只能在单一的域中提取水印.为此,本文针 ...

  5. FigDraw 25. SCI文章中绘图二维密度图及组合图

    点击关注,桓峰基因 桓峰基因公众号推出基于R语言绘图教程并配有视频在线教程,目前整理出来的教程目录如下: FigDraw 1. SCI 文章的灵魂 之 简约优雅的图表配色 FigDraw 2. SCI ...

  6. 单词搜索(给定一个二维网格和一个单词,找出该单词是否存在于网格中)

    力扣 从二维数组中找字符串是否存在,而且同一个元素不能重复使用.这是字符串匹配类型题目,要记住方法.将二维数组简化成字符串,也就是字符串匹配了(依次遍历每个元素,将其当做开头,开始匹配). 1.可以想 ...

  7. 单词搜索:给定一个二维网格和一个单词,找出该单词是否存在于网格中java实现

    题目描述 https://leetcode-cn.com/problems/word-search 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的 ...

  8. 【MATLAB】三维图形绘制 ( 三维平面图 | 二维网格 | meshgrid 函数 | 绘制网格 | mesh 函授 | 绘制平面 | surf 函数 | 绘制等高线 | contour 函数 )

    文章目录 一.二维网格 1.线图 与 平面图 2.meshgrid 函数生成二维网格 二.绘制网格 1.mesh 函数绘制网格 2.代码示例 三.绘制平面 1.surf 函数绘制平面 2.代码示例 四 ...

  9. 密度图的密度估计_不同类型的二维密度图小教程

    R相关小教程链接: 用R构建气泡图案例小教程 [小教程]散点图.饼图怎么在我的文章中完美展示小教程 热图在论文发表中完美呈现小教程 R与密度.函数.变量的微妙关系 北京市计算中心医用数据库建设解决方案 ...

最新文章

  1. 通过外貌就能看出程序员的资历? | 每日趣闻
  2. 安卓系统底层C语言算法之测试参数是几个long型的算法
  3. 【强化学习】Q-Learning
  4. wxWidgets:wxIntProperty类用法
  5. 总结 构造函数与非构造函数 原型继承的一个方法
  6. python骗局-代购被骗?Python带你征服骗子!直接干掉他的网站!亲身经历!
  7. 数学倒底有没有绝对的严格性和形式化?
  8. git 客户端_GEE 学习笔记 3: 客户端连接远程服务器的 Jupyter ( git 作为本地工具)
  9. Map的实现类中,哪些是有序的,哪些是无序的
  10. 计算机硬盘和光驱的接口类型,请问 各位大神,我的主板硬盘接口类型和光驱接口类型...
  11. LaTeX 格式、字母、符号、公式 (总结)
  12. html表格添加序号,通过layui给数据表格添加序号
  13. 这才是图扑数字孪生污水处理厂该有的样子
  14. Win10系统程序图标上的盾牌怎么去除?
  15. UML(一)六大关系
  16. 数据仓库数据存储与处理
  17. 解决:NoClassDefFoundError: javax/activation/DataSource
  18. linux中zip文件解压命令,Linux中zip压缩和unzip解压缩命令使用方法
  19. 配置汇编环境(王爽)
  20. html5 u3m8,U3M8短语.doc

热门文章

  1. [修正] Berlin 10.1 支持 iPhone 4 (iOS v7.x)
  2. html编写edm时要注意的事
  3. CodeForces 139C Literature Lesson(模拟)
  4. RTTI: dynamic_cast typeid
  5. 用户体验——南通大学教务学生管理系统
  6. vim下php文件中自动缩排html代码
  7. 最有价值的100句话
  8. 局域主机做服务器,安装DNN,外网访问的解决办法
  9. 基于Docker搭建GitLab代码管理
  10. linux date 常用格式,5、总结Linux常用命令使用格式,并用实例说明。例如echo、screen、date、ifconfig、export等命令...