P1506 拯救oibh总部(BFS洪水灌溉)

news/2024/6/29 12:02:33 标签: 宽度优先, 算法

题目:

样例1:

输入
4 5
00000
00*00
0*0*0
00*00
输出
1

 样例2:

输入
5 5
*****
*0*0*
**0**
*0*0*
*****
输出
5

思路:

        洪水灌溉,思路:给该图外面包围一圈可遍历的的点,作为引流灌溉。

BFS外围一点,即可顺流而下的灌溉下去。

代码详解如下:

#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
#include <algorithm>
#include <unordered_map>
#define endl '\n'
#define YES puts("YES")
#define NO puts("NO")
#define mk make_pair
#define x first
#define y second
#define umap unordered_map
#define All(x) x.begin(),x.end()
#pragma GCC optimize(3,"Ofast","inline")
#define IOS std::ios::sync_with_stdio(false),cin.tie(0), cout.tie(0)
using namespace std;
const int N = 2e6 + 10;
using PII = pair<int,int>;
int n,m;
umap<int,string>g;// 地图

int dx[4] = {0,0,1,-1};
int dy[4] = {1,-1,0,0};

inline bool isRun(int x,int y)
{
	return (x >= 0 && x < n && y >= 0 &&y < m && g[x][y] == '0');
}

inline void BFS(int tx,int ty)
{
	queue<PII>q;
	
	q.emplace(mk(tx,ty));
	
	while(q.size())
	{
		PII now = q.front();
		q.pop();
		
		g[now.x][now.y] = '1';	// 标记被灌溉的点
		
		for(int i = 0;i < 4;++i)
		{
			int bx = now.x + dx[i];
			int by = now.y + dy[i];
			if(isRun(bx,by))
			{
				g[bx][by] = '1';	// 标记被灌溉的点
				q.emplace(mk(bx,by));
			}
		}
	}
}


inline void solve()
{
	cin >> n >> m;
	m += 2;	// 由于建了外圈,所以宽度 +2
	
	// 建立上下外圈
	for(int i = 0;i < m;++i)
	{
		g[0] += "0";
		g[n + 1] += "0";
	} 
	
	for(int i = 1;i <= n;++i)
	{
		// 这里是输入地图后,建立两边的外圈
		string s;
		cin >> s;
		g[i] = "0" + s + "0";
	}	
	
	n += 2;	// 由于建立了上下外圈,所以高 + 2
	
	BFS(0,0);	// 引流灌溉
	
	// 获取未被洪水淹没的重要区域
	int ans = 0;
	for(int i = 0;i < n;++i)
	{
		for(int j = 0;j < m;++j)
		{
			if(g[i][j] == '0') ++ans;
		}
	}
	
	cout << ans << endl;
}

int main()
{
//	freopen("a.txt", "r", stdin);
	IOS;
	int _t = 1;
//	cin >> _t;
	while (_t--)
	{
		solve();
	}

	return 0;
}

最后提交:


http://www.niftyadmin.cn/n/5162034.html

相关文章

python 应用之 request 请求调用

场景&#xff1a; 验证一个第三方接口 目录 一、应用实例 1、预准备工作 1&#xff09;、引用包 2&#xff09;、生成随机串 3&#xff09;、获得当前时间戳 4&#xff09;、HASH 5&#xff09;、header处理 6&#xff09;、请求处理 2、requests请求 1&#xff09…

Python学习笔记--属性的访问控制

三、属性的访问控制 之前也有讲到过&#xff0c;Python 没有真正意义上的私有属性。然后这就导致了对 Python 类的封装性比较差。我们有时候会希望 Python 能够定义私有属性&#xff0c;然后提供公共可访问的 get 方法和 set 方法。Python 其实可以通过魔术方法来实现封装。 …

2010年08月04日 Go生态洞察:Defer, Panic, Recover 深度解析

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

三维变换与投影-计算机图形学

目录 三维变换与投影 三维变换原理 为什么C语言头文件要专门放在一个.h文件中呢&#xff1f; 斜投影原理 介绍一下什么是UGC 入口 透视投影 透视投影坐标系 三维变换与投影 三维变换原理 如何把三维物体投影到两维物体上 齐次坐标 加上一维&#xff0c;方便运算 …

API是什么?解密API背后的奥秘

API&#xff0c;全称Application Programming Interface&#xff0c;是一种用于不同应用程序间通信的接口&#xff0c;它允许不同的应用程序之间交换数据和功能。API可以理解为应用程序提供给其他应用程序或开发者的接口&#xff0c;通过这个接口&#xff0c;其他应用程序或开发…

jar包加入本地maven仓库

参数说明&#xff1a; install-file -Dfile&#xff1a;jar包名 DartifactId&#xff1a;对应pom文件中<artifactId>的值 DgroupId&#xff1a;对应pom文件中<groupId>的值 Dversion&#xff1a;对应pom文件中<version>的值 Dpackaging&#xff1a;打包…

力扣:153. 寻找旋转排序数组中的最小值(Python3)

题目&#xff1a; 已知一个长度为 n 的数组&#xff0c;预先按照升序排列&#xff0c;经由 1 到 n 次 旋转 后&#xff0c;得到输入数组。例如&#xff0c;原数组 nums [0,1,2,4,5,6,7] 在变化后可能得到&#xff1a; 若旋转 4 次&#xff0c;则可以得到 [4,5,6,7,0,1,2]若旋转…

Reids系列-Redis持久化与备份 【5】

目录 Reids系列-Redis持久化与备份 【5】Redis 持久化机制Reids持久化流程 RDB持久化原理及配置RDB 快照持久化方式RDB 快照持久化优点RDB 快照持久化缺点执行命令触发RDB持久化备份 AOF持久化原理及配置AOF 快照持久化备份方式AOF文件重写 RDB 与 AOF 的对比选择数据备份与恢复…