当前位置: 首页 > news >正文

算法提高-搜索-FloodFill和最短路

FloodFill和最短路

  • FloodFill
    • Acwing 1097. 池塘计数
    • AcWing 1098. 城堡问题
    • AcWing 1106. 山峰和山谷
  • 最短路
    • AcWing 1076. 迷宫问题
    • AcWing 188. 武士风度的牛
    • AcWing 1100. 抓住那头牛

FloodFill

Acwing 1097. 池塘计数

//acwing 1097. 池塘计数
#include <iostream>
#include <cstring>
#include <algorithm>#define x first
#define y secondusing namespace std;typedef pair<int, int> PII;
const int N = 1e3 + 10;
const int M = 1e3 + 10;
char g[N][M];
bool st[N][M];
PII q[N * M];
int n, m;void bfs (int sx, int sy)
{int hh = 0, tt = 0;q[0] = {sx, sy};st[sx][sy] = true;while (hh <= tt){PII t = q[hh ++ ];for (int i = t.x - 1; i <= t.x + 1 ; i ++ )for (int j = t. y - 1; j <= t.y + 1; j ++ ){if (i == t.x && j == t.y ) continue;//懒得用dx dy,直接遍历它周围9个地方把中间挖去,就是八个方向if (i < 0 || i >= n || j < 0 || j >= m) continue;//判断下标是否合法if (g[i][j] == '.' || st[i][j]) continue;//判断遍历的是否是水坑q[++ tt] = {i, j};st[i][j] = true;//作用是判断是否遍历过}}
}int main()
{int cnt = 0;cin >> n >> m;// for (int i = 0; i < n; i ++ )//     for (int j = 0; j < m; j ++ ) //         scanf ("%c", &g[i][j]); 算出来的cnt = 3;for (int i = 0; i < n; i ++ ) scanf("%s", g[i]);for (int i = 0; i < n; i ++ )//遍历所有地图for (int j = 0; j < m; j ++ )if (g[i][j]  == 'W' && !st[i][j]){bfs(i, j);//找到一个没遍历过的水坑,用bfs将其扩展cnt ++ ;}cout << cnt ;    return 0;
}

AcWing 1098. 城堡问题

#include <iostream>
#include <algorithm>using namespace std;typedef pair<int, int> PII;
#define x first
#define y secondconst int N = 51, M = 51;
PII q[N * M];
int g[N][M];
bool st[N][M];int n, m;int bfs(int sx, int sy)
{int area = 0;//房间大小int hh = 0, tt = -1;q[++ tt ] = {sx, sy};int dx[4] = {0, -1, 0, 1};//上下左右四个方向int dy[4] = {-1, 0, 1, 0};while (hh <= tt){PII t = q[hh ++ ];st[t.x][t.y] = true;area ++ ;for (int i = 0; i <= 3; i ++ )//很精髓的地方,配合题意给的二进制,用一个for移动方格的同时配合二进制判断这个位置是否有墙//因此我们dx,dy数组的定义就得按照题目给的来了,西北东南这个顺序{int a = t.x + dx[i], b = t.y + dy[i];if (a < 0 || a >= n || b < 0 || b >= m) continue;if (st[a][b]) continue;if (g[t.x][t.y] >> i & 1) continue;q[++ tt] = {a, b};st[a][b] = true;}}return area;
}
int main()
{cin >> n >> m;for (int i = 0; i < n; i ++ ) for (int j = 0; j < m; j ++ )scanf ("%d", &g[i][j]);//这题目用的是二进制表示一个方格,不是直接字符串表示地图int cnt = 0;//房间数量int areaMax = 0;//房间大小for (int i = 0; i < n; i ++ )//1.找到房间,2.bfs的作用是扩展房间for (int j = 0; j < m; j ++ )if (!st[i][j])//判断每一个方格是否被遍历过,没有的话就BFS遍历{cnt ++ ;areaMax = max(areaMax, bfs(i, j));//多了一个房间大小,bfs的时候记录一下就行了}cout << cnt << endl << areaMax;return 0;
}

AcWing 1106. 山峰和山谷

这题不能在bfs的时候通过st[i][j]直接continue,否则会多计算peak或者valley,暂时没想到好的解释方法,只能说他为了判断边界,bfs扩展的一层内的每个点都要用来判断一下改山是否是山峰或者山谷,否则一个山可能既是山峰又是山谷,导致多计数了。

#include <iostream>using namespace std;typedef pair<int, int> PII;
#define x first
#define y second
const int N = 1e3 + 10;PII q[N * N];
int g[N][N];
bool st[N][N];int n;void bfs(int sx, int sy, bool& has_higher, bool& has_lower)
{int hh = 0, tt = -1;q[++ tt] = {sx, sy};while (hh <= tt){PII t = q[hh ++];st[t.x][t.y] = true;for (int i = t.x - 1; i <= t.x + 1; i ++ )for (int j = t.y - 1; j <= t.y + 1; j ++ ){if (i < 0 || i >= n || j < 0 || j >= n) continue;if (i == t.x && j == t.y) continue;//if (st[i][j]) continue; //不能直接跳过,因为需要重复使用这个联通块内的点来判断边界if (g[i][j] != g[t.x][t.y])//判断边界,是否是一片山脉{if(g[i][j] > g[t.x][t.y]) has_higher = true;//判断边界,//利用反向判断:是否连通块周围没有比他更高的或者更矮的else has_lower = true;}else if(!st[i][j]){st[i][j] = true;q[++ tt] = {i, j};}}}
}
int main()
{cin >> n;for (int i = 0; i < n; i ++ )for (int j = 0; j < n; j ++ )scanf("%d", &g[i][j]);int peak = 0;int valley = 0;for (int i = 0; i < n; i ++ )for (int j = 0; j < n; j ++ ){if (!st[i][j]){bool has_higher = false;bool has_lower = false;bfs(i, j, has_higher, has_lower);if (!has_higher) peak ++;if (!has_lower) valley ++;}}cout << peak << " " << valley;return 0;
}

最短路

AcWing 1076. 迷宫问题

#include <iostream>
#include <cstring>
using namespace std;typedef pair<int, int> PII;#define x first
#define y secondconst int N = 1e3 + 10;PII q[N * N];
int g[N][N];
PII pre[N][N];int n;void bfs(int sx, int sy)
{memset(pre, -1, sizeof pre);//pre里面是pair,这个会将pair的第一个值赋值为-1pre[n - 1][n - 1] = {100000, 100000};//因为是倒着bfs的,所以起点(n-1,n-1)的上一个点随便复制即可,防止它重复入队,浪费时间int dx[4] = {-1, 0, 1, 0};int dy[4] = {0, 1, 0, -1};int hh = 0, tt = -1;q[++ tt] = {sx, sy};while (hh <= tt){PII t = q[hh ++];for (int i = 0; i <= 3; i ++ ){int a = t.x + dx[i], b = t.y + dy[i];if (a < 0 || a >= n || b < 0 || b >= n) continue;if (pre[a][b].x != -1) continue;//pre也起到了一个st数组的作用,判断当前这个点是否到达过了,因为第一次到达才是最短的if (!g[a][b]) //非1可以走{pre[a][b] = t;q[++ tt] = {a, b};}}}
}int main()
{cin >> n;for (int i = 0; i < n; i ++ )for (int j = 0; j < n; j ++ )scanf("%d", &g[i][j]);bfs(n - 1, n - 1);PII end = {0, 0};while (true)//这个倒序打印挺经典的{printf("%d %d\n", end.x, end.y);if (end.x == n - 1 && end.y == n - 1) break;//如果打印到终点 n - 1 n -1了就退出循环end = pre[end.x][end.y];}return 0;
}

AcWing 188. 武士风度的牛

#include <iostream>
#include <cstring>using namespace std;
typedef pair<int, int> PII;
#define x first
#define y secondconst int N = 150 + 10;char g[N][N];
PII q[N * N];
int dist[N][N];
int n, m;int bfs()
{int dx[8] = {1, 2, -1, -2, -2, -1, 1, 2};int dy[8] = {-2, -1, -2, -1, 1, 2, 2, 1};int sx, sy;for (int i = 0; i < n; i ++ )for (int j = 0; j < m; j ++ )if (g[i][j] == 'K')sx = i, sy = j;memset(dist, -1, sizeof dist);//省去一个st数组int hh = 0, tt = -1;q[++ tt] = {sx, sy};dist[sx][sy] = 0;//自己到自己的距离为0while (hh <= tt){PII t = q[hh ++];for (int i = 0; i <= 7; i ++ ){int a = t.x + dx[i], b = t.y + dy[i];if (a < 0 || a >= n || b < 0 || b >= m) continue;if (g[a][b] == '*') continue;if (dist[a][b] != -1) continue;if (g[a][b] == 'H') return dist[t.x][t.y] + 1;dist[a][b] = dist[t.x][t.y] + 1;q[++ tt] = {a, b};}}
}int main()
{cin >> n >> m;for (int i = 0; i < n; i ++ ) cin >> g[i];cout << bfs();return 0;}

AcWing 1100. 抓住那头牛

相关文章:

算法提高-搜索-FloodFill和最短路

FloodFill和最短路 FloodFillAcwing 1097. 池塘计数AcWing 1098. 城堡问题AcWing 1106. 山峰和山谷 最短路AcWing 1076. 迷宫问题AcWing 188. 武士风度的牛AcWing 1100. 抓住那头牛 FloodFill Acwing 1097. 池塘计数 //acwing 1097. 池塘计数 #include <iostream> #inc…...

【蓝桥杯单片机第八届国赛真题】

【蓝桥杯单片机第八届国赛真题】 文章目录 【蓝桥杯单片机第八届国赛真题】前言一、真题二、源码 前言 有幸进入国赛&#xff0c;为自己大学最后一个比赛画上完满的句号^^ 下面为蓝桥杯单片机第八届国赛程序部分&#xff0c;功能差不多都实现了&#xff0c;可能存在小bug&#…...

一种简单的Android骨架屏实现方案----0侵入0成本

对骨架屏的理解 什么是骨架屏 所谓骨架屏&#xff0c;就是在页面进行耗时加载时&#xff0c;先展示的等待 UI, 以告知用户程序目前正在运行&#xff0c;稍等即可。 等待的UI大部分是 loading 转圈的弹窗&#xff0c;有的是自己风格的小动画。其实大同小异。而骨架屏无非也是一…...

【Kubernetes 架构】了解 Kubernetes 网络模型

Kubernetes 网络使您能够在 k8s 网络内配置通信。它基于扁平网络结构&#xff0c;无需在主机和容器之间映射端口。 Kubernetes 网络支持容器化组件之间的通信。这种网络模型的主要优点是不需要在主机和容器之间映射端口。然而&#xff0c;配置 Kubernetes 网络模型并不是一件容…...

shell

一、判断当前磁盘剩余空间是否有20G&#xff0c;如果小于20G&#xff0c;则将报警邮件发送给管理员&#xff0c;每天检查一次磁盘剩余空间。 二、判断web服务是否运行 三、使用curl命令访问第二题的web服务&#xff0c;看能否正常访问&#xff0c;如果能正常访问&#xff0c;…...

springboot+ssm+java校园二手物品交易系统vxkyj

样需要经过市场调研&#xff0c;需求分析&#xff0c;概要设计&#xff0c;详细设计&#xff0c;编码&#xff0c;测试这些步骤&#xff0c;基于Java语言、Jsp技术设计并实现了校园二手物品交易系统。系统主要包括个人中心、商家管理、用户管理、商品分类管理、商品信息管理、商…...

Android系统内置应用

Android系统内置应用 背景 客户提供APK&#xff0c;需要集成进系统&#xff0c;并且不可卸载 Android原生是怎么做的&#xff1f; 已Launcher3为例&#xff0c;apk是位于/system/priv-app/Launcher3目录下 AOSP系统内置app步骤 1.在package/apps/目录下创建相应的文件夹如&…...

CMMI实施需要准备什么:

1. 人力资源 实施中会涉及到EPG过程改进小组、QA、试点项目团队等人力资源&#xff1a; 1) 专职人员&#xff1a;1-2名 即在CMMI实施推广期内&#xff0c;基本上100%的时间投入。 2) 质量人员&#xff1a;1-更多名 组建质量管理部门&#xff0c;实施体系执行的监控&#x…...

【ARM AMBA AXI 入门 1 - AXI 握手协议】

文章目录 1.1 AXI 双向握手机制简介1.1.1 信号列表1.1.2 双向握手目的1.1.3 握手过程 1.2 数据通路的握手要求1.2.1 读数据通路1.2.2 读地址通路1.2.3 写数据通路1.2.4 写地址通路1.2.5 写回复通路1.2.6 全信号 1.3 不同数据通路间的约束关系1.3.1 读操作约束关系1.3.2 写操作约…...

详解uni-app应用生命周期函数

详解uni-app应用生命周期函数 详解uni-app应用生命周期函数 文章目录 详解uni-app应用生命周期函数前言一、应用生命周期函数二、页面生命周期函数总结 前言 UNI-APP学习系列之详解uni-app应用生命周期函数 一、应用生命周期函数 函数名说明onLaunch当uni-app 初始化完成时触…...

【WebFlux】List指定bean引用对象更新后同步到List

Java 8的流式API实现 如果你想在WebFlux中更新List中指定bean的引用对象并将其同步到List中&#xff0c;你可以使用Java 8的流式API来完成这个任务。 以下是一个例子&#xff1a; List<MyBean> myBeanList new ArrayList<>(); MyBean myBean1 new MyBean(); My…...

【JavaSE】Java基础语法(二十六):Collection集合

文章目录 1. 数组和集合的区别2. 集合类体系结构3. Collection 集合概述和使用【应用】4. Collection集合的遍历【应用】5. 增强for循环【应用】 1. 数组和集合的区别 相同点 都是容器,可以存储多个数据不同点 数组的长度是不可变的,集合的长度是可变的 数组可以存基本数据类型…...

jmeter做接口压力测试_jmeter接口性能测试

jmeter是apache公司基于java开发的一款开源压力测试工具&#xff0c;体积小&#xff0c;功能全&#xff0c;使用方便&#xff0c;是一个比较轻量级的测试工具&#xff0c;使用起来非常简单。因为jmeter是java开发的&#xff0c;所以运行的时候必须先要安装jdk才可以。jmeter是免…...

网络编程 lesson5 IO多路复用

select 当需要在一个或多个文件描述符上等待事件发生时&#xff0c;可以使用select函数。 select函数是一个阻塞调用&#xff0c;它会一直等待&#xff0c;直到指定的文件描述符上有事件发生或超时。 select函数详解 int select(int nfds, fd_set *readfds, fd_set *writefd…...

码出高效_第一章 | 有意思的二进制表示及运算

目录 0与1的世界1.如何理解32位机器能够同时处理处理32位电路信号&#xff1f;2.如何理解负数的加减法运算3.溢出在运算中如何理解4.计算机种常用的存储单位及转换5.位移运算规则6.有趣的 && 和 & 浮点数1.定点小数&#xff08;为什么会出现浮点数表示&#xff1f;…...

测试类型(单元、集成、系统或手动测试)

测试类型(单元、集成、系统或手动测试) 单元测试 单元是系统的单个组件&#xff0c;例如类或单个方法。孤立地测试单元称为单元测试。 优点&#xff1a;速度快/易控/易写 缺点&#xff1a;缺乏现实性/无法捕获所有错误&#xff08;例如与其他组件或服务的交互&#xff09; 单元…...

【笔试强训编程题】Day3.(字符串中找出连续最长的数字串 69385)和(数组中出现次数超过一半的数字 23271)

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训编程题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;! 文章目录…...

学懂缓存雪崩,缓存击穿,缓存穿透仅需一篇,基于Redis讲解

在了解缓存雪崩、击穿、穿透这三个问题前&#xff0c;我们需要知道为什么我们需要缓存。在了解这三个问题后&#xff0c;我们也必须知道使用Redis时&#xff0c;如何解决这些问题。 所以我将按照"为什么我们需要缓存"、"什么是缓存雪崩、击穿、穿透"、&qu…...

Android 12.0SystemUI 状态栏下拉和通知栏始终居中

1.概述 在12.0的产品定制化开发中,在系统原生的SystemUI 状态栏下拉和通知栏,默认是根据手势的x 坐标的位置居中显示,但是如果太靠两边感觉不太好,下拉太靠边不太好看所以产品提出不管手势在哪里下滑 都要去下拉和通知栏居中显示 会比较好看些 下面就来实现这个需求 2.Sy…...

面向过程编程和面向对象编程的区别

目录 一、面向过程编程 举个栗子&#xff1a; 二、面向对象编程 继续举个栗子&#xff1a; 三、区别 面向过程编程和面向对象编程是两种不同的编程范式&#xff0c;它们在代码的组织和结构上有所不同。 一、面向过程编程 面向过程编程&#xff08;Procedural Programmin…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

WPF八大法则:告别模态窗口卡顿

⚙️ 核心问题&#xff1a;阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程&#xff0c;导致后续逻辑无法执行&#xff1a; var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题&#xff1a…...

十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建

【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...

从零开始了解数据采集(二十八)——制造业数字孪生

近年来&#xff0c;我国的工业领域正经历一场前所未有的数字化变革&#xff0c;从“双碳目标”到工业互联网平台的推广&#xff0c;国家政策和市场需求共同推动了制造业的升级。在这场变革中&#xff0c;数字孪生技术成为备受关注的关键工具&#xff0c;它不仅让企业“看见”设…...

TCP/IP 网络编程 | 服务端 客户端的封装

设计模式 文章目录 设计模式一、socket.h 接口&#xff08;interface&#xff09;二、socket.cpp 实现&#xff08;implementation&#xff09;三、server.cpp 使用封装&#xff08;main 函数&#xff09;四、client.cpp 使用封装&#xff08;main 函数&#xff09;五、退出方法…...

【1】跨越技术栈鸿沟:字节跳动开源TRAE AI编程IDE的实战体验

2024年初&#xff0c;人工智能编程工具领域发生了一次静默的变革。当字节跳动宣布退出其TRAE项目&#xff08;一款融合大型语言模型能力的云端AI编程IDE&#xff09;时&#xff0c;技术社区曾短暂叹息。然而这一退场并非终点——通过开源社区的接力&#xff0c;TRAE在WayToAGI等…...

[QMT量化交易小白入门]-六十二、ETF轮动中简单的评分算法如何获取历史年化收益32.7%

本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写100篇左右。 QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。 文章目录 相关阅读1. 策略概述2. 趋势评分模块3 代码解析4 木头…...

Shell 解释器​​ bash 和 dash 区别

bash 和 dash 都是 Unix/Linux 系统中的 ​​Shell 解释器​​&#xff0c;但它们在功能、语法和性能上有显著区别。以下是它们的详细对比&#xff1a; ​​1. 基本区别​​ ​​特性​​​​bash (Bourne-Again SHell)​​​​dash (Debian Almquist SHell)​​​​来源​​G…...