acwing提高——BFS的Flood Fill和最短路模型

news2024/12/29 8:47:09

Flood Fill

1.Lake Counting

题目http://ybt.ssoier.cn:8088/problem_show.php?pid=1249

 自己写的(好理解)

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
const int N=120;
int n,m;
char a[N][N];
bool st[N][N];
int sum;
int dx[]={-1,-1,-1,0,0,1,1,1},dy[]={-1,0,1,-1,1,-1,0,1};
void bfs(int x,int y)
{
	st[x][y]=true;
	for(int i=0;i<4;i++)
	{
		int xx=dx[i]+x,yy=dy[i]+y;
		if(a[xx][yy]=='W'&&!st[xx][yy])
		bfs(xx,yy);
	}
}
void solve()
{
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			if(a[i][j]=='W'&&!st[i][j])
			{
				sum++;
				bfs(i,j);
			}
		}
	}
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	for(int j=1;j<=m;j++)
	cin>>a[i][j];
	solve();
	cout<<sum;
} 

y总的 (标准)(手写队列)

#include<bits/stdc++.h>
using namespace std;
#define x first
#define y second
typedef pair<int,int> pii;
const int N=115;
int n,m,cnt=0;
char g[N][N];
bool st[N][N];
pii q[N*N];
void bfs(int sx,int sy)
{
    int hh=0,tt=0;
    q[0]={sx,sy};
    st[sx][sy]=true;
    while(hh<=tt)
    {
        auto 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<0||i>=n||j<0||j>=m) continue;//假如越界则continue
               if(st[i][j]) continue;//假如标记过则continue
               if(g[i][j]=='.') continue;//假如是干燥的则continue
               st[i][j]=true;//标记这个点被标记过
               q[++tt]={i,j};//把这个积水放进队列用,以后用他来更新其他的积水
            }
    }
}
int main()
{
  cin>>n>>m;
  for(int i=0;i<n;i++) cin>>g[i];
  for(int i=0;i<n;i++)//遍历每一个点
    for(int j=0;j<m;j++)
      if(!st[i][j]&&g[i][j]=='W')//假如之前没标记过并且是新的水洼
      {
          bfs(i,j);//遍历这个水洼覆盖的水洼
          cnt++;//水洼数量加一
      }
  cout<<cnt<<endl;
   return 0;
}

 2.The Castle(城堡问题)

题目 http://ybt.ssoier.cn:8088/problem_show.php?pid=1250

 

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
#define x first
#define y second
const int N=55;
int  g[N][N];
bool st[N][N];
PII q[N*N];
int n,m;
int dx[]={0,-1,0,1},dy[]={-1,0,1,0};
int bfs(int x,int y)
{
	int hh=0,tt=0;
	int area=0;
	q[0]={x,y};
	st[x][y]=true;
	while(hh<=tt)
	{
		PII t=q[hh++];
		area++;
		for(int i=0;i<4;i++)
		{
			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++)
	cin>>g[i][j];
	int cnt=0,area=0;
	for(int i=0;i<n;i++)
	for(int j=0;j<m;j++)
	{
		if(!st[i][j])
		{
			area=max(area,bfs(i,j));
			cnt++;
		}
	}

	cout<<cnt<<endl<<area;
}

3.山峰和山谷

题目http://ybt.ssoier.cn:8088/problem_show.php?pid=1454

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
#define x first
#define y second
const int N=1010;
int  h[N][N];
bool st[N][N];
PII q[N*N];
int n;

int dx[]={-1,-1,-1,0,0,1,1,1},dy[]={-1,0,1,-1,1,-1,0,1};
void bfs(int x,int y,bool &has_higher,bool &has_lower)
{
	int hh=0,tt=0;
	q[hh]={x,y};
	st[x][y]=true;
	while(hh<=tt)
	{
		PII t=q[hh++];
		for(int i=0;i<8;i++)
		{
			int xx=t.x+dx[i],yy=t.y+dy[i];
			if(xx<=0||xx>n||yy<=0||yy>n)continue;
	
			if(h[xx][yy]>h[t.x][t.y])
			has_higher=true;
			else if(h[xx][yy]<h[t.x][t.y])
			has_lower=true;
			else if(!st[xx][yy])
			{
				st[xx][yy]=true;
				q[++tt]={xx,yy};
			}
		}
	}
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	for(int j=1;j<=n;j++)
	cin>>h[i][j];
	int peak=0,valley=0;
	for(int i=1;i<=n;i++)
	for(int j=1;j<=n;j++)
	{
		if(!st[i][j])
		{
			bool has_higher=false,has_lower=false;
			bfs(i,j,has_higher,has_lower);
			if(!has_higher)peak++;
			if(!has_lower)valley++;
		}
	} 
	cout<<peak<<" "<<valley;
}

最短路模型 

1.迷宫问题

题目 icon-default.png?t=N4HBhttp://ybt.ssoier.cn:8088/problem_show.php?pid=1255

#include<bits/stdc++.h>
using namespace std;
#define x first
#define y second
typedef pair<int,int> PII;

const int N=10;
int n;
int g[N][N];
PII q[N*N];
PII pre[N][N];
bool st[N][N];
int dx[]={-1,0,1,0},dy[]={0,-1,0,1};
void bfs(int x,int y)
{
	int hh=0,tt=0;
	q[0]={x,y};
	st[x][y]=true;
	pre[x][y]={0,0};
	while(hh<=tt)
	{
		PII t=q[hh++];
		for(int i=0;i<4;i++)
		{
			int xx=t.x+dx[i],yy=t.y+dy[i];
			if(xx<0||xx>=n||yy<0||yy>=n)continue;
			if(st[xx][yy])continue;
			if(g[xx][yy])continue;
			pre[xx][yy]=t;
			q[++tt]={xx,yy};
			st[xx][yy]=true;
		}
	}
}
int main()
{
	n=5;
	for(int i=0;i<n;i++)
	for(int j=0;j<n;j++)
	cin>>g[i][j];
	bfs(n-1,n-1);
	PII end(0,0);
	while(true)
	{
		cout<<"("<<end.x<<", "<<end.y<<")"<<endl;
		if(end.x==n-1&&end.y==n-1)break;
		end=pre[end.x][end.y];
	}
}

2.武士风度的牛 

题目 icon-default.png?t=N4HBhttps://www.acwing.com/problem/content/190/

#include<bits/stdc++.h>
using namespace std;
#define x first
#define y second
typedef pair<int,int> PII;

const int N=160;
int n,m;
char g[N][N];
PII q[N*N];
bool st[N][N];
int dx[]={-1,-2,-2,-1,1,2,2,1},dy[]={-2,-1,1,2,2,1,-1,-2};
int dist[N][N];
void bfs(int x,int y)
{
	int hh=0,tt=0;
	q[0]={x,y};
	st[x][y]=true;
	dist[x][y]=0;
	while(hh<=tt)
	{
		PII t=q[hh++];
		for(int i=0;i<8;i++)
		{
			int xx=t.x+dx[i],yy=t.y+dy[i];
			if(xx<0||xx>=m||yy<0||yy>=n)continue;
			if(st[xx][yy])continue;
			if(g[xx][yy]=='*')continue;
			dist[xx][yy]=dist[t.x][t.y]+1;
			q[++tt]={xx,yy};
			st[xx][yy]=true;
		}
	}
}
int main()
{
	cin>>n>>m;
	int sx,sy,ex,ey;
	for(int i=0;i<m;i++)
	for(int j=0;j<n;j++)
	{
		cin>>g[i][j];
		if(g[i][j]=='K')sx=i,sy=j;
		if(g[i][j]=='H')ex=i,ey=j; 
	}
	bfs(sx,sy);
	cout<<dist[ex][ey];
}

3.抓住那头牛

题目 icon-default.png?t=N4HBhttp://ybt.ssoier.cn:8088/problem_show.php?pid=1253

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int n,k;
int dist[N];//记录每个点到起点的步数
int q[N];
int bfs()
{
    int hh=0,tt=0;
    q[0]=n;
    memset(dist,-1,sizeof dist);
    dist[n]=0;
    while(hh<=tt)
    {
        int t=q[hh++];
        if(t==k) return dist[k];//返回到起点的步数
        if(t+1<N&&dist[t+1]==-1)//第一种情况走,且该位置没有被走过
        {
            dist[t+1]=dist[t]+1;//则该点距离+1
            q[++tt]=t+1;//将该点放进队列中
        }
        if(t-1>=0&&dist[t-1]==-1)//第二种情况走,且该位置没有被走过
        {
            dist[t-1]=dist[t]+1;//则该点距离+1
            q[++tt]=t-1;//将该点放进队列中
        }
        if(2*t<N&&dist[2*t]==-1)//第三种情况走,且该位置没有被走过
        {
            dist[2*t]=dist[t]+1;//则该点距离+1
            q[++tt]=2*t;//将该点放进队列中
        }
    }
    return 0;
}
int main()
{
   cin>>n>>k;
   cout<<bfs()<<endl;//输出最小步数
   return 0;
}

 

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

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

相关文章

Prompt合集

作者 来自&#xff1a;f Prompt主要内容 我想让你充当「英语翻译员」、「拼写纠正员」和「改进员」。 我会用任何语言与你交谈&#xff0c;你会检测语言&#xff0c;翻译它并用我的文本的更正和改进版本用英语回答。 我希望你用更优美优雅的「高级英语单词」和句子替换我简化…

【EMC专题】为什么PCB上的单端阻抗控制在50欧?

每当我们在发板后和PCB板厂沟通说有些走线需要阻抗控制,控制在多少多少。其实我们所说的阻抗是传输线的特性阻抗。特性阻抗是不能用万用表测量出来的,他由传输线的结构以及材料决定,与传输线的长度、信号的幅度、频率等均无关。 特性阻抗的概念 当电磁波在电缆上…

【Unity100个实用小技巧】保证原图片的情况下,动态扩展图片尺寸

☀️博客主页&#xff1a;CSDN博客主页&#x1f4a8;本文由 萌萌的小木屋 原创&#xff0c;首发于 CSDN&#x1f4a2;&#x1f525;学习专栏推荐&#xff1a;面试汇总❗️游戏框架专栏推荐&#xff1a;游戏实用框架专栏⛅️点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd;&#…

Kafka 原理温故之数据存储格式

背景 周末看系统架构的时候&#xff0c;看到一致性要求时&#xff0c;回忆了一下 Kafka 的消息一致性保障机制&#xff0c;顺便复习了一下 Kafka 的基础信息。 消息文件目录 Kafka 的消息存储目录是由 server.properties 文件的 log.dirs/tmp/kafka-logs 设置的&#xff0c;…

轻量应用服务器腾讯云和阿里云哪家更好?

轻量应用服务器阿里云和腾讯云哪个好&#xff1f;云服务器吧认为腾讯云轻量应用服务器还不错&#xff0c;腾讯云轻量服务器30元起&#xff0c;配置可选2核2G3M、2核2G4M、2核4G5M、4核8G12M、8核16G18M和16核32G28M&#xff0c;阿里云轻量应用服务器配置仅可以选择2核2G3M和2核…

c++对象中动态内存分配

c对象中动态内存分配 假设我们有两个类&#xff0c;一个是电子表格单元格类SpreadsheetCell&#xff0c;另外一个是电子表格类Spreadsheet。我们都使用过电子表格&#xff0c;一个电子表格往往都有行与列组成。所以我们的Spreadsheet类是SpreadsheetCell类的二维数组。 下面我…

MySQL—系统管理

文章目录 一、系统数据库二、常用管理工具mysqlmysqladminmysqlbinlogmysqlshowmysqldumpmysqlimport/source 一、系统数据库 MySQL安装后&#xff0c;默认会带4个数据库&#xff1a; 数据库含义mysql存储MySQL服务器正常运行所需要的各种信息 &#xff08;时区、主从、用户、…

【CAN卡通信的下位机-STM32cubeIDE-hal库+STMF4xx+数据发送和接收+中断接收方式+基础样例(2)】

【CAN卡通信的下位机-STM32cubeIDE-hal库STMF4xx数据发送和接收中断接收方式基础样例2】 1、概述2、实验环境3、问题描述4、自我尝试与努力(1)在网上查照相关配置文章&#xff0c;进行配置对比。(2)对比st的官方样例例程。(3)请教大佬&#xff0c;帮忙查看代码和调试。(4)总之…

【数据结构】散列表(哈希表)

文章目录 前言一、什么是散列表二、什么是哈希函数三、下面简单介绍几种哈希函数四、冲突处理散列冲突的方法开放定址法再散列函数法公共溢出区法链地址法 五、代码实现1.哈希函数2.链表和哈希表的创建3.哈希表初始化3.从哈希表中根据key查找元素4.哈希表插入元素5.元素删除6.哈…

100天精通Python(可视化篇)——第85天:matplotlib绘制不同种类炫酷气泡图参数说明+代码实战(网格、自定义颜色、钟型、交互、打卡、动态气泡图)

文章目录 专栏导读1. 气泡图介绍1&#xff09;介绍2&#xff09;参数说明 2. 普通气泡图3. 网格气泡图4. 自定义气泡图颜色5. 不同颜色气泡图6. 钟型气泡图7. 交互气泡图8. 打卡气泡图9. 动态气泡图 专栏导读 &#x1f525;&#x1f525;本文已收录于《100天精通Python从入门到…

实战打靶集锦-020-Tre

提示&#xff1a;本文记录了博主一次艰难又失败的提权经历 目录 1. 主机发现2. 端口扫描3. 服务枚举4. 服务探查4.1 Apache探查4.1.1 adminer.php4.1.2 /cms/目录4.1.3 /info.php页面4.1.4 nikto扫描4.1.5 dirb扫描4.1.6 登录Adminer 5. 提权5.1 系统信息枚举5.2 定时任务枚举5…

SocketTools 11在所有HTTP客户端组件支持

SocketTools 11在所有HTTP客户端组件支持 在所有HTTP客户端组件中添加了对HTTP/2.0协议的支持。 更新了TLS 1.2(及更高版本)和SSH 2.0的安全选项&#xff0c;以使用Microsoft Windows 11和Windows Server 2022中提供的密码套件。较旧、安全性较低的密码套件已被弃用&#xff0…

21级计组硬件实验三-八位串行加法器验证

问题1&#xff1a; 小明同学正在做【半加器、全加器与八位串行加法器实验】&#xff0c;他画好了电路图&#xff0c;但还有不少困难&#xff0c;现在他求助于你&#xff0c;请你帮他解决。 答&#xff1a;选A 注释&#xff1a;A是与门&#xff0c;B是或门&#xff0c;C是同…

【cmake】cmake 实现交叉编译

在PC上开发时&#xff0c;我们可以直接在PC端编译、链接、运行&#xff0c;但是到了嵌入式环境&#xff0c;由于嵌入式的设备资源&#xff08;CPU、RAM&#xff09;无法和PC端相比&#xff0c;如果项目比较复杂&#xff0c;很难甚至不可能在设备上编译。因此&#xff0c;我们一…

vue diff算法与虚拟dom知识整理(9) 手写patch递归子节点上树,用自己写的patch实现虚拟节点替换

上文 我们做到让一个文字虚拟节点上树 但子节点显然还 没有完成 那这次我们继续 递归的话 我们需要换个思路 我们将 src下的入口文件 index.js代码改成这样 import h from "./snabbdom/h"; import patch from "./snabbdom/patch";const container docum…

Apache Zeppelin系列教程第七篇——运行paragraph的整个流程分析

Zeppelin运行paragraph的整个流程分析 前文分别讲述了&#xff0c;JdbcInterpreter、Interpreter、Zengine的流程&#xff0c;本文来主要串联起来paragraph的整个流程 前端 首先前端部分点运行的时候是通过websocket向后端发送请求的zeppelin-web/src/components/websocket/…

swp协议-1

Swp接口是UICC和CLF&#xff08;非接前端&#xff09;之间的面向比特流&#xff0c;点到点通信的协议。CLF是主设备&#xff08;master&#xff09;&#xff0c;UICC是从设备&#xff08;slave&#xff09;。图SWP数据传输虽然是单线协议&#xff0c;但是是全双工数字传输。 1 …

电商项目之海量操作日志的实现

文章目录 1 问题背景2 前言3 思考4 解决思路5 交互6 工作原理7 伪代码实现7.1 安装并配置Canal Server7.2 Canal客户端拉取MQ消息7.3 Canal数据的转换7.4 定制自己的业务逻辑 1 问题背景 有时候客户做了某些操作却不认账&#xff0c;咱们又拿不出证据&#xff1b;有时候客户将账…

入参校验1

文章目录 一、简介1、快速失败(Fail Fast) 二、单字段类入参校验三、JSON实体类校验1、注解解析2、案例1、简单校验2、分组校验3、嵌套校验4、集合校验5、自定义校验 四、相关1、源码文件2、参考地址 一、简介 1、快速失败(Fail Fast) Spring Validation 默认会校验完所有字段…

GPT-4的免费使用方法分享(续)

GPT-4的免费使用方法分享_我爱OJ的博客-CSDN博客 在这篇博客里&#xff0c;我介绍了一些ChatGPT的一些使用方法&#xff0c;但可能有一定的缺陷&#xff0c;有的需要魔法&#xff0c;所以&#xff0c;今天我就来亲测一下&#xff0c;关于ChatGPT的一些免费使用技巧 目录 镜像…