双指针、BFS和图论算法

双指针、BFS和图论算法

  • 一、双指针
    • 例题
      • 日志统计
        • 题目信息
        • 思路
        • 题解
  • 二、BFS
    • 例题
      • 1、献给阿尔吉侬的花束
        • 题目信息
        • 思路
        • 题解
      • 2、红与黑
        • 题目信息
        • 思路
        • 题解
  • 图论
    • 例题
      • 交换瓶子
        • 题目信息
        • 思路
        • 题解

一、双指针

例题

日志统计

题目信息

在这里插入图片描述
在这里插入图片描述

思路

在这里插入图片描述

题解
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
#define maxsize 100100
using namespace std;int n,d,k;
int cnt[maxsize];
pair <int,int> num[maxsize];
bool flag[maxsize];signed main()
{ios::sync_with_stdio();cin.tie(0);cout.tie(0);cin>>n>>d>>k;for(int i=0;i<n;i++){cin>>num[i].first>>num[i].second;}sort(num,num+n);for(int i=0,j=0;j<n;j++){cnt[num[j].second]++;while(num[j].first-num[i].first>=d){cnt[num[i].second]--;i++;}if(cnt[num[j].second]>=k) flag[num[j].second]=true;}for(int i=0;i<=100000;i++){if(flag[i]) cout<<i<<endl;}return 0;
}

二、BFS

适合用于查找一条合法的路径或最小步数

例题

1、献给阿尔吉侬的花束

题目信息

在这里插入图片描述
在这里插入图片描述

思路

在这里插入图片描述
在这里插入图片描述

题解
#include <bits/stdc++.h>
#define endl '\n'
#define int long long
#define maxsize 210
using namespace std;int t,r,c;
char maps[maxsize][maxsize];
int dis[maxsize][maxsize];
pair <int,int> weizhi;int bfs(pair<int,int> start,pair<int,int> end)
{queue<pair<int,int>> q;memset(dis,-1,sizeof(dis));dis[start.first][start.second]=0;q.push(start);int dx[4]={-1,0,1,0};int dy[4]={0,1,0,-1};while(!q.empty()){auto tmp=q.front();q.pop();for(int i=0;i<4;i++){int x=tmp.first+dx[i];int y=tmp.second+dy[i];//越界的情况if(x<0 || y<0 || x>=r || y>=c) continue;//障碍物if(maps[x][y]=='#') continue;//之前已经遍历过if(dis[x][y] != -1 ) continue;dis[x][y]=dis[tmp.first][tmp.second]+1;if(end==make_pair(x,y)) return dis[x][y];q.push(make_pair(x,y));}}return -1;
}signed main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);pair<int,int> start,end;cin>>t;for(int i=0;i<t;i++){cin>>r>>c;for(int j=0;j<r;j++){for(int k=0;k<c;k++){cin>>maps[j][k];if(maps[j][k]=='S'){start.first=j;start.second=k;}if(maps[j][k]=='E'){end.first=j;end.second=k;} }     }int distance=bfs(start,end);if(distance==-1){cout<<"oop!"<<endl;}else{cout<<distance<<endl;}}return 0;
}

2、红与黑

题目信息

在这里插入图片描述
在这里插入图片描述

思路

在这里插入图片描述

题解
#include <bits/stdc++.h>
#define int long long
#define maxsize 30
using namespace std;int h,w;
char maps[maxsize][maxsize];
bool flag[maxsize][maxsize];
queue<pair<int,int>> q;int bfs(pair<int,int> start)
{int count=0;int dx[4]={-1,0,1,0};int dy[4]={0,1,0,-1};q.push(start);flag[start.first][start.second]=true;count++;while(!q.empty()){auto tmp=q.front();q.pop();for(int i=0;i<4;i++){int x=tmp.first+dx[i];int y=tmp.second+dy[i];if(x<0 || y<0 || x>=h || y>=w) continue;if(maps[x][y]=='#') continue;if(flag[x][y]==true) continue;q.push(make_pair(x,y));flag[x][y]=true;count++;}}return count;
}signed main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);pair<int,int> start;while(true){cin>>w>>h;if(w==0&&h==0) break;for(int i=0;i<h;i++){for(int j=0;j<w;j++){cin>>maps[i][j];if(maps[i][j]=='@'){start.first=i;start.second=j;}}}int cnt=bfs(start);cout<<cnt<<endl;//恢复现场memset(maps,0,sizeof(maps));memset(flag,false,sizeof(flag));}return 0;
}

图论

例题

交换瓶子

题目信息

在这里插入图片描述
在这里插入图片描述

思路

在这里插入图片描述

题解
#include <bits/stdc++.h>
#define endl '\n'
#define int long long
#define maxsize 10010
using namespace std;int n;
int a[maxsize];
bool num[maxsize];signed main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>n;int cnt=0;for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<=n;i++){if(!num[i]){cnt++;for(int j=i;!num[j];j=a[j]){num[j]=true;}}}cout<<n-cnt<<endl;return 0;
}

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

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

相关文章

使用nginx输入端口号显示404

输入对应的端口号显示404 先检查当前nginx文件夹的路径是没有中文的查看是否没有开启nginx&#xff1a;ctrlaltdelete打开任务管理器&#xff0c;看看有没有nginx.exe进程&#xff08;一般是有两个进程&#xff09;如果没有进程说明没有打开nginx&#xff0c;查看端口号是否被…

MySQL基础-----SQL语句之DCL数据控制语句

目录 前言 一、管理用户 1.查询用户 2.创建用户 3.修改用户密码 4.删除用户 案例 二、权限控制 1.查询权限 2.授予权限 3.撤销权限 案例 前言 本期我们学习SQL语句的最后一部分内容&#xff0c;也就是数据控制语句DCL。DCL英文全称是Data Control Language(数据控制语…

Java BigDecimal常用的方法介绍

在 Java 中&#xff0c;BigDecimal 类是一个用于高精度十进制浮点运算的类。与 double 和 float 类型相比&#xff0c;BigDecimal 提供了一个精确的十进制控制&#xff0c;并且在商业计算中非常重要&#xff0c;因为它可以避免由于浮点数精度不准确而导致的错误。 以下是 BigDe…

前端工程化【01】:核心思想、发展历程和面临挑战

前端工程化是指将前端开发中的工具、流程和方法进行规范化和自动化&#xff0c;以提高前端开发效率、提升代码质量和项目可维护性的一种开发方式。通过前端工程化&#xff0c;可以将前端开发过程中的重复工作自动化&#xff0c;减少开发者的重复劳动&#xff0c;提高开发效率。…

谷粒学院--在线教育实战项目【一】

谷粒学院--在线教育实战项目【一】 一、项目概述1.1.项目来源1.2.功能简介1.3.技术架构 二、Mybatis-Plus概述2.1.简介2.2.特性 三、Mybatis-Plus入门3.1.创建数据库3.2.创建 User 表3.3.初始化一个SpringBoot工程3.4.在Pom文件中引入SpringBoot和Mybatis-Plus相关依赖3.5.第一…

图机器学习(1)--导论

0 引入 为什么是图&#xff1f;图是描述关联数据的通用语言。 前期的研究&#xff1a;节点之间独立同分布&#xff0c;没有关系。 图&#xff1a;节点之间有关联关系。 0.1 图数据举例 0.2 问题描述 黏菌按照人类规划的铁路网进行生长。 复杂域具有丰富的关系结构&#xf…

开放式高实时高性能PLC控制器解决方案-基于米尔电子STM32MP135

前言 随着工业数字化进程加速与IT/OT深入融合&#xff0c;不断增加的OT核心数据已经逐步成为工业自动化行业的核心资产&#xff0c;而OT层数据具备高实时、高精度、冗余度高、数据量大等等特点&#xff0c;如何获取更加精准的OT数据对数字化进程起到至关重要的作用&#xff0c;…

虽说主业搞前端,看到如此漂亮的网页UI,也是挪不开眼呀。

漂亮的网页UI能够吸引人的眼球&#xff0c;给人留下深刻的印象。作为前端开发人员&#xff0c;可以通过不断学习和掌握设计技巧和工具&#xff0c;提升自己的UI设计能力&#xff0c;为用户提供更好的视觉体验。 以下是一些提升网页UI设计能力的建议&#xff1a; 学习设计基础知…

MySQL基础(未完待续...)

数据库基础 MySQL概述 数据库相关概念 名称作用简称数据库存储数据的仓库&#xff0c;数据是有组织的进行存储DataBase&#xff08;DB&#xff09;数据库管理系统操纵和管理数据库的大型软件DataBase Management System (DBMS)SQL操作关系型数据库的编程语言&#xff0c;定义…

个人项目介绍4:三维园区篇

个人项目介绍: 地图铁路线路篇 地球卫星篇 火车站篇 三维园区篇 项目需求&#xff1a; 1.按比例全景显示三维园区 2.精确显示园区内设备设施 3.实时显示设备报警信息 4.显示园区内摄像监控设备&#xff0c;并可点击显示监控视频流 5.显示园区内的重大危险源和风险分布 …

算法题 — 三个数的最大乘机

三个数的最大乘机 整型数组 nums&#xff0c;在数组中找出由三个数字组成的最大乘机&#xff0c;并输出这个乘积。&#xff08;乘积不会越界&#xff09; 重点考察&#xff1a;线性扫描 排序法&#xff1a; public static void main(String[] args) {System.out.println(so…

SpringMVC实用技术

1.校验框架 1.表单校验框架入门 表单校验的重要性 数据可以随意输入&#xff0c;导致错误的结果。表单校验保障了数据有效性、安全性 表单校验分类 校验位置&#xff1a; 客户端校验 服务端校验 校验内容与对应方式&#xff1a; 格式校验 客户端&#xff1a;使用Js技术…