D. Labyrinth(双端队列BFS)

news/2024/6/29 11:50:59 标签: 宽度优先, 算法

Problem - D - Codeforces

你正在玩一款电脑游戏。其中一个关卡将你置于一个迷宫中,它由n行构成,每行包含m个单元格。每个单元格要么是空闲的,要么被障碍物占据。起始单元格位于第r行和第c列。在一步中,如果目标单元格没有被障碍物占据,您可以向上、左、下或右移动一个方格。您不能越过迷宫的边界。

不幸的是,您的键盘即将损坏,因此您可以向左移动不超过x次,向右移动不超过y次。由于用于向上和向下移动的键处于完好状态,因此对向上和向下移动的步数没有限制。

现在,您想确定对于每个单元格,是否存在一系列移动,可以将您从起始单元格移动到该特定单元格。有多少个单元格具有这种属性?

输入 第一行包含两个整数n、m(1 ≤ n,m ≤ 2000)——迷宫中的行数和列数。

第二行包含两个整数r、c(1 ≤ r ≤ n,1 ≤ c ≤ m)——定义起始单元格的行索引和列索引。

第三行包含两个整数x、y(0 ≤ x,y ≤ 109)——允许向左和向右移动的最大次数。

接下来的n行描述了迷宫。每一行都有m个字符,只有符号'.'和''。第i行第j个字符对应迷宫中位于第i行和第j列的单元格。符号'.'表示空闲单元格,而符号''表示带障碍物的单元格。

保证起始单元格不包含障碍物。

输出 准确输出一个整数——可以从起始单元格到达的迷宫单元格数量,包括起始单元格本身。

Examples

input

Copy

4 5
3 2
1 2
.....
.***.
...**
*....

output

Copy

10

input

Copy

4 4
2 2
0 1
....
..*.
....
....

output

Copy

7

题解:
好长时间没写双端队列BFS,没有想到用双端队列去优化,

对于没有限制的条件,肯定让其先走,对于有限制的条件,让没有限制的走完再继续走,双端队列BFS的核心思想

#include <cstdio>
#include <cstring>
#include <algorithm>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<cmath>
#include<queue>
using namespace std;
typedef long long ll;
#define int long long
typedef pair<int,int> PII;
int mod = 1e9 + 7;
int n,m,sx,sy,x,y;
char a[2005][2005];
int vis[2005][2005];
int dx[4] = {0,0,1,-1};
int dy[4] = {-1,1,0,0};
struct node
{
	int tx,ty,x,y;
};
void solve()
{
	cin >> n >> m;
	cin >> sx >> sy >> x >> y;
	for(int i = 1;i <= n;i++)
	{
		for(int j = 1;j <= m;j++)
		{
			cin >> a[i][j];
		}
	}
	deque<node> q;
	vis[sx][sy] = 1;
	q.push_front({sx,sy,x,y});
	while(q.size())	
	{
		node t = q.front();
		q.pop_front();
		for(int i = 0;i < 4;i++)
		{
			int tx = t.tx + dx[i];
			int ty = t.ty + dy[i];
			if(i == 0&&!t.x)
			{
				continue;
			}
			if(i == 1&&!t.y)
			{
				continue;
			}
			if(tx >= 1&&tx <= n&&ty >= 1&&ty <= m&&a[tx][ty] == '.'&&!vis[tx][ty])
			{
				vis[tx][ty] = 1;
				if(i == 0)
				{
					q.push_back({tx,ty,t.x - 1,t.y});
				}
				else if(i == 1)
				{
					q.push_back({tx,ty,t.x,t.y - 1});
				}
				else
				{
					q.push_front({tx,ty,t.x,t.y});
				}
			}
		}
	}
	int cnt = 0;
	for(int i = 1;i <= n;i++)
	{
		for(int j = 1;j <= m;j++)
		{
			if(vis[i][j])
			cnt++;
		}
	}
	cout << cnt;
}

signed main()
{
//	ios::sync_with_stdio(0 );
//	cin.tie(0);cout.tie(0);
	int t = 1;
//	cin >> t;
	while(t--)
	{
		solve(); 
	}
}

 


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

相关文章

三、Spring Cloud Alibaba组件nacos

一、什么是Nacos 官方地址&#xff1a; https://nacos.io/zh-cn/docs/v2/what-is-nacos.html 概念&#xff1a; 服务&#xff08;Service&#xff09;是 Nacos 世界的一等公民。Nacos 支持几乎所有主流类型的“服务”的发现、配置和管理。即集注册中心配置中心服务管理的一个平…

基于ArkUI框架开发——图片模糊处理的实现

原文&#xff1a;基于ArkUI框架开发——图片模糊处理的实现&#xff0c;点击链接查看更多技术内容。 现在市面上有很多APP&#xff0c;都或多或少对图片有模糊上的设计&#xff0c;所以&#xff0c;图片模糊效果到底怎么实现的呢&#xff1f; 首先&#xff0c;我们来了解下模糊…

Umi 插件实战教程

引言 笔者最近开发了一款 umi 插件&#xff1a;plugin-umi-cmdk[1],该插件的功能主要是&#xff1a;在 umi 项目里可以方便的集成 cmd k &#xff0c;实现菜单等搜索。 主体功能并不复杂&#xff0c;但是在集成作为 umi 插件过程中踩了不少坑&#xff0c;主要是 umi 官方文档的…

Centos7安装mongoDB详细过程

添加MongoDB的YUM仓库 在终端中执行以下命令&#xff0c;添加MongoDB的YUM仓库&#xff1a; sudo vi /etc/yum.repos.d/mongodb-org-4.4.repo 在打开的文件中&#xff0c;输入以下内容&#xff1a; [mongodb-org-4.4] nameMongoDB Repository baseurlhttps://repo.mongodb.or…

SPSS如何进行使用时间序列模型之案例实训?

文章目录 0.引言1.时间序列数据平稳处理2.指数平滑法建模3.ARIMA建模4.季节性分解 0.引言 因科研等多场景需要进行绘图处理&#xff0c;笔者对SPSS进行了学习&#xff0c;本文通过《SPSS统计分析从入门到精通》及其配套素材结合网上相关资料进行学习笔记总结&#xff0c;本文对…

【前端面经】ES6-Promise:理解链式调用、状态和方法

介绍 在现代 JavaScript 中&#xff0c;Promise 已经成为了一个非常流行的特性。它允许开发者编写更易于阅读和维护的异步代码。Promise 是表示可能尚未可用的值的对象。在本篇博客中&#xff0c;我们将深入探讨 Promise 的链式调用、状态和方法。我们将会介绍 Promise 的基本…

Socks5 代理协议:网络安全中的利器

随着网络的普及&#xff0c;网络安全问题已成为各行各业所面临的共同难题。为了保护自己的网络安全&#xff0c;不少人选择使用代理IP&#xff0c;其中 Socks5 代理协议因其安全性、灵活性等优势备受青睐。本文将介绍 Socks5 代理协议及其在网络安全中的作用。 一、什么是 Soc…

21. 资源的调度——PodAffinity:Pod 亲和与互斥调度策略

本章讲解知识点 前言PodAffinity 概念实验1. 前言 在实际的生产环境中有一类特殊的 Pod 调度需求:存在某些相互依赖、频繁调用的 Pod,它们需要被尽可能地部署在同一个 Node 节点、机架、机房、网段内,这就是 Pod 之间的亲和性;反之,出于避免竞争或者容错的需求,我们也可…