【优选算法】(第四十一篇)

news2024/11/29 22:28:16

目录

被围绕的区域(medium)

题目解析

讲解算法原理

编写代码

迷宫中离⼊⼝最近的出⼝(medium)

题目解析

讲解算法原理

编写代码


被围绕的区域(medium)

题目解析

1.题目链接:. - 力扣(LeetCode)

2.题目描述

给你⼀个mxn的矩阵board,由若⼲字符'X'和'O',找到所有被'X'围绕的区域,并将这些区域⾥所有的'O'⽤'X'填充。
⽰例1:


输⼊:board=[["X","X","X","X"],["X","O","O","X"],["X","X","O","X"],["X","O","X","X"]]

输出:[["X","X","X","X"],["X","X","X","X"],["X","X","X","X"],["X","O","X","X"]]
解释:被围绕的区间不会存在于边界上,换句话说,任何边界上的'O'都不会被填充为'X'。任何不在边界上,或不与边界上的'O'相连的'O'最终都会被填充为'X'。如果两个元素在⽔平或垂直⽅向相邻,则称它们是“相连”的。
⽰例2:

输⼊:board=[["X"]]

输出:[["X"]]
提⽰:
m==board.length
n==board[i].length
1<=m,n<=200
board[i][j]为'X'或'O'

讲解算法原理

解法:
算法思路:

正难则反。
可以先利⽤ bfs 将与边缘相连的 '0' 区域做上标记,然后重新遍历矩阵,将没有标记过的 '0' 修改成 'X' 即可。

编写代码

c++算法代码:

class Solution
{
 int dx[4] = {0, 0, 1, -1};
 int dy[4] = {1, -1, 0, 0};
 int m, n;
public:
 void solve(vector<vector<char>>& board) 
 {
 m = board.size(), n = board[0].size();
 // 1. 先处理边界上的 'O' 联通块,全部修改成 '.'
 for(int j = 0; j < n; j++)
 {
 if(board[0][j] == 'O') bfs(board, 0, j);
 if(board[m - 1][j] == 'O') bfs(board, m - 1, j);
 }
 for(int i = 0; i < m; i++)
 {
 if(board[i][0] == 'O') bfs(board, i, 0);
 if(board[i][n - 1] == 'O') bfs(board, i, n - 1);
 }
 // 2. 还原
 for(int i = 0; i < m; i++)
 for(int j = 0; j < n; j++)
 if(board[i][j] == 'O') board[i][j] = 'X';
 else if(board[i][j] == '.') board[i][j] = 'O';
 }
 void bfs(vector<vector<char>>& board, int i, int j)
 {
 queue<pair<int, int>> q;
 q.push({i, j});
 board[i][j] = '.';
 while(q.size())
 {
 auto [a, b] = q.front();
 q.pop();
 for(int k = 0; k < 4; k++)
 {
 int x = a + dx[k], y = b + dy[k];
 if(x >= 0 && x < m && y >= 0 && y < n && board[x][y] == 'O')
 {
 q.push({x, y});
 board[x][y] = '.';
 }
 }
 }
 }
};

java算法代码:

class Solution
{
 int[] dx = {0, 0, 1, -1};
 int[] dy = {1, -1, 0, 0};
 int m, n;
 public void solve(char[][] board) 
 {
 m = board.length; n = board[0].length;
 // 1. 先处理边界的 'O' 联通块,全部修改成 '.'
 for(int j = 0; j < n; j++)
 {
 if(board[0][j] == 'O') bfs(board, 0, j);
 if(board[m - 1][j] == 'O') bfs(board, m - 1, j);
 }
 for(int i = 0; i < m; i++)
 {
 if(board[i][0] == 'O') bfs(board, i, 0);
 if(board[i][n - 1] == 'O') bfs(board, i, n - 1);
 }
 // 2. 还原
 for(int i = 0; i < m; i++)
 for(int j = 0; j < n; j++)
 if(board[i][j] == 'O') board[i][j] = 'X';
 else if(board[i][j] == '.') board[i][j] = 'O';
 }
 public void bfs(char[][] board, int i, int j)
 {
 Queue<int[]> q = new LinkedList<>();
 q.add(new int[]{i, j});
 board[i][j] = '.';
 while(!q.isEmpty())
 {
 int[] t = q.poll();
 int a = t[0], b = t[1];
 for(int k = 0; k < 4; k++)
 {
 int x = a + dx[k], y = b + dy[k];
 if(x >= 0 && x < m && y >= 0 && y < n && board[x][y] == 'O')
 {
 board[x][y] = '.';
 q.add(new int[]{x, y});
 }
 }
 }
 }
}

迷宫中离⼊⼝最近的出⼝(medium)

题目解析

1.题目链接:. - 力扣(LeetCode)

2.题目描述

给你⼀个mxn的迷宫矩阵maze(下标从0开始),矩阵中有空格⼦(⽤'.'表⽰)和墙(⽤'+'表⽰)。同时给你迷宫的⼊⼝entrance,⽤entrance=[entrancerow,entrancecol]表⽰你⼀开始所在格⼦的⾏和列。
每⼀步操作,你可以往上,下,左或者右移动⼀个格⼦。你不能进⼊墙所在的格⼦,你也不能离开迷宫。你的⽬标是找到离entrance最近的出⼝。出⼝的含义是maze边界上的空格⼦。
entrance格⼦不算出⼝。请你返回从entrance到最近出⼝的最短路径的步数,如果不存在这样的路径,请你返回-1。
⽰例1:


输⼊:maze=[["+","+",".","+"],[".",".",".","+"],["+","+","+","."]],entrance=[1,2]

输出:1
解释:
总共有3个出⼝,分别位于(1,0),(0,2)和(2,3)。⼀开始,你在⼊⼝格⼦(1,2)处。
◦ 你可以往左移动2步到达(1,0)。◦ 你可以往上移动1步到达(0,2)。从⼊⼝处没法到达(2,3)。
所以,最近的出⼝是(0,2),距离为1步。

⽰例2:


输⼊:maze=[["+","+","+"],[".",".","."],["+","+","+"]],entrance=[1,0]

输出:2
解释:
迷宫中只有1个出⼝,在(1,2)处。(1,0)不算出⼝,因为它是⼊⼝格⼦。初始时,你在⼊⼝与格⼦(1,0)处。◦ 你可以往右移动2步到达(1,2)处。所以,最近的出⼝为(1,2),距离为2步。
⽰例3:


输⼊:maze=[[".","+"]],entrance=[0,0]
输出:-1
解释:
这个迷宫中没有出⼝。

提⽰:
maze.length==m
maze[i].length==n
1<=m,n<=100
maze[i][j]要么是'.',要么是'+'。
entrance.length==2
0<=entrancerow<m
0<=entrancecol<n
entrance⼀定是空格⼦。

讲解算法原理

解法(bfs求最短路):
算法思路:

利⽤层序遍历来解决迷宫问题,是最经典的做法。
我们可以从起点开始层序遍历,并且在遍历的过程中记录当前遍历的层数。这样就能在找到出⼝的时候,得到起点到出⼝的最短距离。

编写代码

c++算法代码:

class Solution
{
 int dx[4] = {0, 0, 1, -1};
 int dy[4] = {1, -1, 0, 0};
public:
 int nearestExit(vector<vector<char>>& maze, vector<int>& e) 
 {
 int m = maze.size(), n = maze[0].size();
 bool vis[m][n];
 memset(vis, 0, sizeof vis);
 queue<pair<int, int>> q;
 q.push({e[0], e[1]});
 vis[e[0]][e[1]] = true;
 int step = 0;
 while(q.size())
 {
 step++;
 int sz = q.size();
 for(int i = 0; i < sz; i++)
 {
 auto [a, b] = q.front();
 q.pop();
 for(int j = 0; j < 4; j++)
 {
 int x = a + dx[j], y = b + dy[j];
 if(x >= 0 && x < m && y >= 0 && y < n && maze[x][y] == '.'
&& !vis[x][y])
 {
 // 判断是否已经到达出⼝
 if(x == 0 || x == m - 1 || y == 0 || y == n - 1) return
 step;
 q.push({x, y});
 vis[x][y] = true;
 }
 }
 }
 }
 return -1;
 }
};

java算法代码:

class Solution
{
 int[] dx = {0, 0, -1, 1};
 int[] dy = {1, -1, 0, 0};
 public int nearestExit(char[][] maze, int[] e) 
 {
 int m = maze.length, n = maze[0].length;
 boolean[][] vis = new boolean[m][n];
 Queue<int[]> q = new LinkedList<>();
 q.add(new int[]{e[0], e[1]});
 vis[e[0]][e[1]] = true;
 int step = 0;
 while(!q.isEmpty())
 {
 step++;
 int sz = q.size();
 for(int i = 0; i < sz; i++)
 {
 int[] t = q.poll();
 int a = t[0], b = t[1];
 for(int j = 0; j < 4; j++)
 {
 int x = a + dx[j], y = b + dy[j];
 if(x >= 0 && x < m && y >= 0 && y < n && maze[x][y] == '.'
&& !vis[x][y])
 {
 // 判断是否已经到出⼝
 if(x == 0 || x == m - 1 || y == 0 || y == n - 1) return
 step;
 vis[x][y] = true;
 q.add(new int[]{x, y});
 }
 }
 }
 }
 return -1;
 }
}

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

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

相关文章

DevExpress WPF中文教程:Data Grid(数据网格)实现细节一览

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

LLM - 配置 ModelScope SWIFT 测试 Qwen2-VL 视频微调(LoRA) 教程(3)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/142882496 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 SWIFT …

Java项目:155 ssm高校学生管理系统(含论文+说明文档)

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 高校学生管理系统有管理员&#xff0c;教师&#xff0c;学生三个角色。 ​ 有个人中心&#xff0c;教师管理&#xff0c;学生管理&#xff0…

Spring MVC:精通JSON数据返回的几种高效方式

前言 在实际开发中&#xff0c;我们在前后端传送数据通常使用Json格式&#xff0c;而在Spring MVC中返回Json格式的方式有多种&#xff0c;接下来我将介绍其中一些。 准备工作 为了演示Json格式的数据&#xff0c;我们准备一个实体类&#xff0c;例如User&#xff0c;这些可以测…

Ubantu配置net8.0环境

1、下载net8.0SDK包 下载地址&#xff1a;Download .NET 8.0 (Linux, macOS, and Windows) 下载命令&#xff1a; wget https://download.visualstudio.microsoft.com/download/pr/853490db-6fd3-4c17-ad8e-9dbb61261252/3d36d7d5b861bbb219aa1a66af6e6fd2/dotnet-sdk-8.0.4…

“DataOps+大模型”——数造科技在大模型时代的数据开发创新探索

写在前面 自《“数据要素x”三年行动计划》印发以来&#xff0c;各界积极投身于探索数据开发的新技术、新应用场景和新模式&#xff0c;力求通过挖掘数据要素的价值来推动新型生产力的蓬勃发展。在这个过程中&#xff0c;以大模型为核心的人工智能技术为数据开发工作带来了全新…

中学数学教学期刊是核心期刊吗?

中学数学教学期刊是核心期刊吗&#xff1f; 《中学数学教学》不是核心期刊&#xff0c;属于省级期刊。 该期刊由安徽省教育厅主管&#xff0c;合肥师范学院、安徽师范大学数学系、安徽省数学学会主办。 虽然它在中学数学教育领域有一定的影响力&#xff0c;被中国国家哲学社…

springboot 整合 快手 移动应用 用户事件 消息回调 验证

快手 移动应用 WebHook 接入指南https://mp.kuaishou.com/platformDocs/openAbility/webHook/accessGuide.html 上代码 import cn.dev33.satoken.annotation.SaIgnore; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import lombok.RequiredArgsConstruc…

【Java】—— 数据结构与集合源码:数据结构概述与线性表、二叉树

1. 数据结构剖析 我们举一个形象的例子来理解数据结构的作用&#xff1a; 战场&#xff1a;程序运行所需的软件、硬件环境 敌人&#xff1a;项目或模块的功能需求 指挥官&#xff1a;编写程序的程序员 士兵和装备&#xff1a;一行一行的代码 战术和策略&#xff1a;数据结构 上…

分享5款堪称神器的软件

​ 今天再来推荐5个超级好用的效率软件&#xff0c;每个都堪称神器中的神器&#xff0c;用完后觉得不好用你找我。 1. 启动器——Launchy ​ Launchy是一款开源的启动器软件&#xff0c;帮助用户快速启动应用程序、文件夹和文件。用户只需通过快捷键调出Launchy界面&#xff…

FFmpeg的简单使用【Windows】--- 视频混剪+添加背景音乐

一、功能描述 点击背景音乐区域的【选择文件】按钮&#xff0c;选择音频文件并将其上传到服务器&#xff0c;上传成功后会将其存储的位置路径返回。 然后&#xff0c;点击要处理视频区域的【选择文件】按钮选择要进行混剪的视频素材&#xff08;1-10个&#xff09;。 以上两…

使用three.js 实现蜡烛效果

使用three.js 实现蜡烛效果 import * as THREE from "three" import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js"var scene new THREE.Scene(); var camera new THREE.PerspectiveCamera(60, window.innerWidth / window.in…

SpringBoot技术支持的桂林景点导航

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

华为云CodeArts API:API管理一体化平台 9月新特性上线啦!

CodeArts API是面向开发者&#xff0c;提供API设计、API开发、API文档、API调试、 API自动化测试一体化协作平台&#xff0c;通过维护API各开发阶段数据高度一致&#xff0c;支持开发者高效实现API设计、API开发、API测试一站式体验。 2024年9月&#xff0c;CodeArts API主要发…

JAVA开源项目 在线考试系统 计算机毕业设计

本文项目编号 T 007 &#xff0c;文末自助获取源码 \color{red}{T007&#xff0c;文末自助获取源码} T007&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 系…

bat(批处理脚本学习)

输出banner echo off echo () echo JL echo ^|^| echo LJ echo _,--"""""""---. echo , …

服务端技术架构演进之路

服务端技术架构演进之路 目录 服务端技术架构演进之路 0.架构中常见概念及理解 1.单机架构 2.应用数据分离架构 3.应用服务器集群架构 4.读写分离/主从分离架构 5.冷热分离架构 6.垂直分库架构 7.微服务架构 8.容器编排架构 本文以一个 " 电子商务 " 应…

[CS报错] error CS1617: /langversion 的选项“12”无效。使用 “/langversion:?“ 列出支持的值

报错 error CS1617: /langversion 的选项“12”无效。使用 “/langversion:?” 列出支持的值 解决 方法一 升级SDK,升级.NET6.0SDK或者.NET7.0SDK… 方法二 调整项目语言版本&#xff1a; 如果你不想或不能升级 SDK&#xff0c;可以通过调整项目文件 .csproj 中的 Lang…

AFSim仿真系统 --- 系统简解_11 行为与行为树

行为与行为树 行为树是一种人工智能技术&#xff0c;它使用户能够快速创建灵活的行为体&#xff0c;这些行为体包含各种战术模块&#xff0c;称为“行为”或“行为节点”。通过连接节点&#xff0c;可以将这些节点以多样且相互关联的方式组合在一起以定义行为。 快速入门 一…

微软默认软件要是换成这些,工作效率直接飙升10倍不止

你的电脑配置明明比别人高&#xff0c;打开文件却比别人慢&#xff0c;这是为什么&#xff1f; 有可能就是软件的问题&#xff0c;如果微软默认软件都被替换成下面这些宝藏级免费工具&#xff0c;工作效率直接飙升10倍不止&#xff01; Everything Windows自带的搜索工具速度…