【递归、搜索与回溯】DFS解决FloodFill算法
一、经验总结
之前我们已经研究过了BFS解决FloodFill算法:【优选算法】BFS解决FloodFill算法-CSDN博客
DFS只是遍历顺序发生了变化,其他需要注意的点大差不差。
二、相关编程题
2.1 图像渲染
题目链接
733. 图像渲染 - 力扣(LeetCode)
题目描述

算法原理
以给定的初始坐标为起点开始进行DFS,将遍历到的每个位置都修改为新的颜色值(可以防止重复遍历)。需要注意的是,如果修改前后的颜色值相同则会出现重复遍历以至于死循环的结果,所以要进行特殊处理。
编写代码
class Solution {int dx[4] = {1, -1, 0, 0};int dy[4] = {0, 0, 1, -1};int m, n, oldcolor, newcolor;
public:vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int color) {if(image[sr][sc] == color) return image;m = image.size(), n = image[0].size();newcolor = color, oldcolor = image[sr][sc];image[sr][sc] = newcolor;DFS(image, sr, sc);return image;}void DFS(vector<vector<int>>& image, int sr, int sc){for(int i = 0; i < 4; ++i){int x=sr+dx[i], y = sc+dy[i];if(x>=0 && x<m && y>=0 && y<n && image[x][y]==oldcolor){image[x][y] = newcolor;DFS(image, x, y);}}}
};
2.2 岛屿数量
题目链接
200. 岛屿数量 - 力扣(LeetCode)
题目描述

算法原理

遍历grid数组,当遇到未访问的陆地时:
- 统计岛屿数量
- 以该位置为起点进行深度优先遍历,遍历整个连通块
- 将整个连通块中的所有陆地都标记为已访问
编写代码
class Solution {int m, n, ret;vector<vector<bool>> visited;int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0, 0};
public:int numIslands(vector<vector<char>>& grid) {m = grid.size(), n = grid[0].size();visited.resize(m, vector<bool>(n, false));for(int i = 0; i < m; ++i){for(int j = 0; j < n; ++j){if(grid[i][j]=='1' && !visited[i][j]){++ret;DFS(grid, i, j);}}}return ret;}void DFS(vector<vector<char>>& grid, int r, int c){visited[r][c] = true;for(int i = 0; i < 4; ++i){int x=r+dx[i], y=c+dy[i];if(x>=0 && x<m && y>=0 && y<n && grid[x][y]=='1' && !visited[x][y]){DFS(grid, x, y);}}}
};
2.3 岛屿的最大面积
题目链接
695. 岛屿的最大面积 - 力扣(LeetCode)
题目描述

算法原理
同上一题基本相同,之不过需要多添加一个变量用于统计每个岛屿的面积。最终返回岛屿的最大面积。
编写代码
class Solution {int m, n, ret, tmp;vector<vector<bool>> visited;int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0, 0};
public:int maxAreaOfIsland(vector<vector<int>>& grid) {m = grid.size(), n = grid[0].size();visited.resize(m, vector<bool>(n, false));for(int i = 0; i < m; ++i){for(int j = 0; j < n; ++j){if(grid[i][j]==1 && !visited[i][j]){tmp = 0;DFS(grid, i, j);ret = max(tmp, ret);}}}return ret;}void DFS(vector<vector<int>>& grid, int r, int c){++tmp;visited[r][c] = true;for(int i = 0; i < 4; ++i){int x=r+dx[i], y=c+dy[i];if(x>=0 && x<m && y>=0 && y<n && grid[x][y]==1 && !visited[x][y]){DFS(grid, x, y);}}}
};
2.4 被围绕的区域
题目链接
130. 被围绕的区域 - 力扣(LeetCode)
题目描述

算法原理

编写代码
class Solution {int m, n;int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0, 0};
public:void solve(vector<vector<char>>& board) {m = board.size(), n = board[0].size();for(int i = 0; i < m; ++i){if(board[i][0] == 'O') DFS(board, i, 0);if(board[i][n-1] == 'O') DFS(board, i, n-1);}for(int j = 0; j < n; ++j){if(board[0][j] == 'O') DFS(board, 0, j);if(board[m-1][j] == 'O') DFS(board, m-1, j);}for(int i = 0; i < m; ++i){for(int j = 0; j < n; ++j){if(board[i][j] == 'O') board[i][j] = 'X';if(board[i][j] == '.') board[i][j] = 'O';}}}void DFS(vector<vector<char>>& board, int r, int c){board[r][c] = '.';for(int i = 0; i < 4; ++i){int x=r+dx[i], y=c+dy[i];if(x>=0 && x<m && y>=0 && y<n && board[x][y]=='O'){DFS(board, x, y);}}}
};
2.5 太平洋大西洋水流问题
题目链接
417. 太平洋大西洋水流问题 - 力扣(LeetCode)
题目描述

算法原理
- 统计太平洋水流:以紧邻太平洋的水域(第一行和第一列)为起点逆着水流的方向(>=)进行深度优先遍历,将DFS访问过的水域标记在pacific哈希表。
- 统计大西洋水流:以紧邻大西洋的水域(最后一行和最后一列)为起点逆着水流的方向(>=)进行深度优先遍历,将DFS访问过的水域标记在atlantic哈希表。
- 找到太平洋和大西洋水流的交集,返回结果。
编写代码
class Solution {int m, n;int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0, 0};vector<vector<bool>> pacific;vector<vector<bool>> atlantic;
public:vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) {m = heights.size(), n = heights[0].size();pacific.resize(m, vector<bool>(n, false));atlantic.resize(m, vector<bool>(n, false));vector<vector<int>> ret;for(int i = 0; i < m; ++i){if(!pacific[i][0]) DFS(heights, pacific, i, 0);if(!atlantic[i][n-1]) DFS(heights, atlantic, i, n-1);}for(int j = 0; j < n; ++j){if(!pacific[0][j]) DFS(heights, pacific, 0, j);if(!atlantic[m-1][j]) DFS(heights, atlantic, m-1, j);}for(int i = 0; i < m; ++i){for(int j = 0; j < n; ++j){if(pacific[i][j] && atlantic[i][j]){ret.push_back({i, j});}}}return ret;}void DFS(vector<vector<int>>& heights, vector<vector<bool>>& ocean, int r, int c){ocean[r][c] = true;for(int i = 0; i < 4; ++i){int x=r+dx[i], y=c+dy[i];if(x>=0 && x<m && y>=0 && y<n && !ocean[x][y] && heights[x][y]>=heights[r][c]){DFS(heights, ocean, x, y);}}}
};
2.6 扫雷游戏
题目链接
529. 扫雷游戏 - 力扣(LeetCode)
题目描述

算法原理
见代码
编写代码
class Solution {//注意:有8个方向的向量int dx[8] = {0, 0, 1, -1, 1, -1, 1, -1}; int dy[8] = {1, -1, 0, 0, 1, -1, -1, 1};int m, n;
public:vector<vector<char>> updateBoard(vector<vector<char>>& board, vector<int>& click) {int sr = click[0], sc = click[1];if(board[sr][sc] == 'M') //点中雷直接返回{board[sr][sc] = 'X';return board;}m = board.size(), n = board[0].size();DFS(board, sr, sc);return board;}void DFS(vector<vector<char>>& board, int r, int c){//统计点击位置周围的地雷数量int cnt = 0;for(int i = 0; i < 8; ++i){int x=r+dx[i], y=c+dy[i];if(x>=0 && x<m && y>=0 && y<n && board[x][y]=='M')++cnt;}if(cnt == 0) //周围没有地雷,向四周继续拓展{board[r][c] = 'B';for(int i = 0; i < 8; ++i){int x=r+dx[i], y=c+dy[i];if(x>=0 && x<m && y>=0 && y<n && board[x][y]=='E')DFS(board, x, y);}}else //周围有地雷,标记周围地雷的数量board[r][c] = cnt+'0';}
};
2.7 衣橱整理
题目链接
LCR 130. 衣橱整理 - 力扣(LeetCode)
题目描述

算法原理
略
编写代码
class Solution {int ret;int _m, _n, _cnt;int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0, 0};bool visited[100][100];
public:int wardrobeFinishing(int m, int n, int cnt) {_m = m, _n = n, _cnt = cnt;DFS(0, 0);return ret;}void DFS(int r, int c){visited[r][c] = true;++ret;for(int i = 0; i < 4; ++i){int x=r+dx[i], y=c+dy[i];if(x>=0 && x<_m && y>=0 && y<_n && !visited[x][y] && digit(x)+digit(y)<=_cnt)DFS(x, y);}}int digit(int num){int sum = 0;while(num > 0){sum+=num%10;num/=10;}return sum;}
};
相关文章:
【递归、搜索与回溯】DFS解决FloodFill算法
一、经验总结 之前我们已经研究过了BFS解决FloodFill算法:【优选算法】BFS解决FloodFill算法-CSDN博客 DFS只是遍历顺序发生了变化,其他需要注意的点大差不差。 二、相关编程题 2.1 图像渲染 题目链接 733. 图像渲染 - 力扣(LeetCode&am…...
【Spine学习12】之 事件帧
1、新建事件帧: 2、选择第8s的攻击帧,点击第一步新建的attack事件帧前面的钥匙 这样每次动作到8s的时候会自动跳出事件帧提示 这个文字实际动画不会显示 事件是动画过程中所发生情况的触发器。 给程序员识别的...
【C语言习题】31.冒泡排序
文章目录 作业标题作业内容2.解题思路3.具体代码 作业标题 冒泡排序 作业内容 实现一个对整形数组的冒泡排序 2.解题思路 先了解一下冒泡排序: 两两相邻的元素进行比较,如果前面元素大于后面元素就交换两个元素的位置,最终的结果是最大的…...
【Spring Cloud应用框架】
🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…...
Repetition Improves Language Model Embeddings论文阅读笔记
文章提出了一种提高decoder-only LLM的embedding能力的方法,叫echo embeddingslast-token pooling(即直接选最后一个token作为句子的embedding)和直接mean pooling都不如文章提出的echo embedding,做法是把句子重复两次࿰…...
工具清单 - Bug追踪管理
# 工具清单 Bugzilla在新窗口打开 - General-purpose bugtracker and testing tool originally developed and used by the Mozilla project. MPL-2.0 PerlBumpy Booby在新窗口打开 - Simple, responsive and highly customizable PHP bug tracking system. (Source Code在新窗…...
企业内网是如何禁用U盘的?电脑禁用U盘有哪些方法?
在当今企业环境中,数据安全和信息保护至关重要。 为了防止数据泄露和恶意软件传播,很多企业选择在内网中禁用U盘,以控制数据的物理传输。 小编这就来给大家总结一份详细指南!! 关于企业内网如何禁用U盘的指南&#x…...
怎样打印微信文档文件?
在日常生活和工作中,我们经常需要打印微信中的文档文件,无论是工作资料、学习笔记还是其他重要信息。随着科技的发展,我们不再需要前往打印店进行繁琐的操作,而是可以通过一些便捷的在线打印平台轻松实现。今天,我们就…...
【讲解下Pip换源】
🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…...
分享:2024年(第12届)“泰迪杯”数据挖掘挑战赛省级奖项获奖名单公示
本次竞赛有评选省奖的省份有广东省、广西壮族自治区、河北省、湖北省。各省奖项依据“泰迪杯”全国评审专家组统一评阅的最终成绩区分省份后从高到低依序按比例产生。 广东省 省级奖项获奖名单公示 奖项设置: 一等奖:约占该省份队伍总数的5%࿰…...
后端开发中缓存的作用以及基于Spring框架演示实现缓存
缓存的作用及演示 现在我们使用的程序都是通过去数据库里拿数据然后展示的 长期对数据库进行数据访问 这样数据库的压力会越来越大 数据库扛不住了 创建了一个新的区域 程序访问去缓存 缓存区数据库 缓存里放数据 有效降低数据访问的压力 我们首先进行一个演示 为了演示…...
Redis原理篇——分布式锁
Redis原理篇——分布式锁 分布式锁是什么?分布式锁有哪些特性?分布式锁常用实现方式Redis 实现分布式锁一、简单的 Redis 锁二、带过期时间的 Redis 锁三、加上 Owner 的 Redis 锁四、Lua 脚本确保原子性 分布式锁是什么? 分布式锁是在分布式…...
css3多列布局
css3多列布局 colmns属性 columns属性是一个简写属性 column-count属性:定义列的数量或者允许的最大列数 auto 为默认值,用于表示列的数量由其他css属性决定number 必须是正整数,用于定义列数量 column-width属性:定义列的宽度 …...
Java开发的构建神器:Maven以及如何安装部署Maven
目录 一、Maven引言1.1 Maven的核心概念✍. POM (Project Object Model)✌. 依赖管理✍. 生命周期与构建阶段✌. 插件系统 1.2 Maven的工作流程✍. 读取POM文件:✌. 依赖解析:✍. 构建生命周期:✌. 插件执行:✍. 构建输出…...
echarts学习:使用dataset管理数据
前言 在我们公司的组件库中有许多echarts图表相关的组件,这些组件在使用时,只需将图表数据以特定的格式传入组件中,十分方便。因此当我得知echarts 可以使用dataset集中管理数据时,我就决定自己一定要搞懂它,于是在最…...
MyBatis逆向工程和MyBatisX插件的使用
文章目录 1.ORM思维2.逆向工程3.MyBatisX插件的使用 1.ORM思维 ORM(Object-Relational Mapping,对象-关系映射)是一种将数据库和面向对象编程语言中的对象之间进行转换的技术。它将对象和关系数据库的概念进行映射,最后我们就可以…...
探索C嘎嘎的奇妙世界:第十四关---STL(string的模拟实现)
1. string类的模拟实现 1.1 经典的string类问题 上一关已经对string类进行了简单的介绍,大家只要能够正常使用即可。在面试中,面试官总喜欢让学生自己来模拟实现string类,最主要是实现string类的构造、拷贝构造、赋值运算符重载以及析构函数…...
【JavaScript脚本宇宙】玩转图像处理:从基础到高级,这些库你不能错过!
让你的网页图像栩栩如生:六种必备图像处理库 前言 在数字图像处理中,我们经常需要对图片进行各种操作,如调整亮度、对比度、饱和度等,以达到所需的效果。为了简化这些操作并提供更丰富的功能,出现了许多专门用于图像…...
python+unity手势控制地球大小
效果图如下 具体操作如下 1 在unity窗口添加一个球体 2 给球体添加材质,材质图片使用地球图片 地球图片如下 unity材质设置截图如下 3 编写地球控制脚本 using System.Collections; using System.Collections.Generic; using UnityEngine;public class test : MonoBehavio…...
CSS【实战】抽屉动画
效果预览 技术要点 实现思路 元素固定布局(fixed)在窗口最右侧外部js 定时器改变元素的 right 属性,控制元素移入,移出 过渡动画 transition transition: 过渡的属性 过渡的持续时间 过渡时间函数 延迟时间此处改变的是 right …...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...
密码学基础——SM4算法
博客主页:christine-rr-CSDN博客 专栏主页:密码学 📌 【今日更新】📌 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 编辑…...
跨平台商品数据接口的标准化与规范化发展路径:淘宝京东拼多多的最新实践
在电商行业蓬勃发展的当下,多平台运营已成为众多商家的必然选择。然而,不同电商平台在商品数据接口方面存在差异,导致商家在跨平台运营时面临诸多挑战,如数据对接困难、运营效率低下、用户体验不一致等。跨平台商品数据接口的标准…...
C# WPF 左右布局实现学习笔记(1)
开发流程视频: https://www.youtube.com/watch?vCkHyDYeImjY&ab_channelC%23DesignPro Git源码: GitHub - CSharpDesignPro/Page-Navigation-using-MVVM: WPF - Page Navigation using MVVM 1. 新建工程 新建WPF应用(.NET Framework) 2.…...
Linux信号保存与处理机制详解
Linux信号的保存与处理涉及多个关键机制,以下是详细的总结: 1. 信号的保存 进程描述符(task_struct):每个进程的PCB中包含信号相关信息。 pending信号集:记录已到达但未处理的信号(未决信号&a…...
Redis专题-实战篇一-基于Session和Redis实现登录业务
GitHub项目地址:https://github.com/whltaoin/redisLearningProject_hm-dianping 基于Session实现登录业务功能提交版本码:e34399f 基于Redis实现登录业务提交版本码:60bf740 一、导入黑马点评后端项目 项目架构图 1. 前期阶段2. 后续阶段导…...
【靶场】XXE-Lab xxe漏洞
前言 学习xxe漏洞,搭了个XXE-Lab的靶场 一、搭建靶场 现在需要登录,不知道用户名密码,先随便试试抓包 二、判断是否存在xxe漏洞 1.首先登录抓包 看到xml数据解析,由此判断和xxe漏洞有关,但还不确定xxe漏洞是否存在。 2.尝试xxe 漏洞 判断是否存在xxe漏洞 A.send to …...
Linux 进程管理学习指南:架构、计划与关键问题全解
Linux 进程管理学习指南:架构、计划与关键问题全解 本文面向初学者,旨在帮助你从架构视角理解 Linux 进程管理子系统,构建系统化学习路径,并通过结构化笔记方法与典型问题总结,夯实基础、明确方向,逐步掌握…...
