原题链接/原题链接(代理站)

题目翻译

给你一个\(n*m\)的迷宫和起始点,有障碍的地方不能走,同时最多向左走\(x\)次,向右走\(y\)次,向上向下没有限制,问你有多少个格子是可以到达的。

输入样例

4 5

3 2

1 2

.....

.*.

...


*....

输出样例

10

数据范围

\(n,m\leqslant 2000\)

考虑最裸的\(bfs\),开一个队列,从起点开始,每搜到一个格子就打上标记。但是这样显然是错的,考虑下面这组数据:

.....

..

...
.

*.
.

*.**.

*....

这是一个\(6*5\)的网格,起始点为\((1,5)\),最多向左走\(5\)次,向右走\(1\)次。

如果我们的\(bfs\)先走的是上面的那条路的话,那么就会输出错误的答案(可以手模一下)。原因是我们给某些关键点打上标记时,剩余的向左走和向右走的次数也许不是最多的,这样会导致有些格子无法访问(但是这样竟然能过Pretest)。

于是我们改变一下搜索的顺序:用双端队列,向上走或向下走时就\(push\)到队头,向左走或向右走时就\(push\)到队尾(其实就是先处理一列)。这样我们就能保证给某个格子打上标记时,当前剩余的向左走和向右走的次数是最多的啦。

代码:

#include <bits/stdc++.h>

using namespace std;

#define N 2000

int n, m, r, c, pp, qq, vis[N+5][N+5], ans;
char a[N+5][N+5]; struct S {
int x, y, le, ri;
}; void bfs() {
deque<S> q;
q.push_front(S{r, c, pp, qq});
vis[r][c] = 1;
int nx, ny;
while(!q.empty()) {
S u = q.front(); q.pop_front();
nx = u.x+1, ny = u.y;
if(nx <= n && !vis[nx][ny] && a[nx][ny] == '.') {
vis[nx][ny] = 1;
q.push_front(S{nx, ny, u.le, u.ri});
}
nx = u.x-1, ny = u.y;
if(nx >= 1 && !vis[nx][ny] && a[nx][ny] == '.') {
vis[nx][ny] = 1;
q.push_front(S{nx, ny, u.le, u.ri});
}
nx = u.x, ny = u.y-1;
if(ny >= 1 && !vis[nx][ny] && u.le >= 1 && a[nx][ny] == '.') {
vis[nx][ny] = 1;
q.push_back(S{nx, ny, u.le-1, u.ri});
}
nx = u.x, ny = u.y+1;
if(ny <= m && !vis[nx][ny] && u.ri >= 1 && a[nx][ny] == '.') {
vis[nx][ny] = 1;
q.push_back(S{nx, ny, u.le, u.ri-1});
}
}
} int main() {
scanf("%d%d%d%d%d%d", &n, &m, &r, &c, &pp, &qq);
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j) cin >> a[i][j];
bfs();
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j) ans += vis[i][j];
cout << ans << endl;
return 0;
}

Codeforces 1064D/1063B Labyrinth的更多相关文章

  1. CodeForces 1063B. Labyrinth 性质

    给定$n *m$的格子 询问从$(r, c)$开始最多向左走$x$步,向右走$y$步 询问有多少个格子可以从$(r, c)$到达 有障碍物,$n, m \leqslant 2 * 10^3$ 对于一个 ...

  2. Codeforces 1064D Labyrinth(双端队列BFS)

    题意: 给一个图,"*"不可以走,给你一个起点,限制向左走L次,向右走R次,上下不限制,问你最多可以走到多少个格子 思路: BFS,每次将上下走的策略加入队首,左右加入队尾,(相当 ...

  3. 【非原创】codeforces 1063B Labyrinth 【01bfs】

    学习博客:戳这里 附本人代码: 1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 co ...

  4. Codeforces 1064 D - Labyrinth

    D - Labyrinth 对于位置(i,j), j - c = R - L = const(常数), 其中R表示往右走了几步,L表示往左走了几步 所以R越大, L就越大, R越小, L就越小, 所以 ...

  5. CodeForces 616C The Labyrinth

    先预处理出所有连通块,对于每一个*,看他四周的连通块即可 #include<cstdio> #include<cstring> #include<queue> #i ...

  6. codeforces 1064D 双端队列BFS

    双端队列BFS解决的就是路径权值可能为0的图最短路问题,权值为0插入队头,否则插入队尾. 对于这个题,可以看作上下移动的路径的权值为0,左右移动权值为1,而且不能超过规定的步数. 直接广搜求覆盖的点的 ...

  7. [ CodeForces 1063 B ] Labyrinth

    \(\\\) \(Description\) 给出一个四联通的\(N\times M\) 网格图和起点.图中有一些位置是障碍物. 现在上下移动步数不限,向左至多走 \(a\) 步,向右至多走 \(b\ ...

  8. CF 1063B Labyrinth

    传送门 解题思路 看上去很简单,\(bfs\)写了一发被\(fst\)...后来才知道好像一群人都被\(fst\)了,这道题好像那些每个点只经过一次的传统\(bfs\)都能被叉,只需要构造出一个一块一 ...

  9. [Codeforces Round #516][Codeforces 1063B/1064D. Labyrinth]

    题目链接:1063B - Labyrinth/1064D - Labyrinth 题目大意:给定一个\(n\times m\)的图,有若干个点不能走,上下走无限制,向左和向右走的次数分别被限制为\(x ...

随机推荐

  1. Python使用Plotly绘图工具,绘制气泡图

    今天来讲讲如何使用Python 绘图工具,Plotly来绘制气泡图. 气泡图的实现方法类似散点图的实现.修改散点图中点的大小,就变成气泡图. 实现代码如下: import plotly as py i ...

  2. SQL Server中LIKE %search_string% 走索引查找(Index Seek)浅析

      在SQL Server的SQL优化过程中,如果遇到WHERE条件中包含LIKE '%search_string%'是一件非常头痛的事情.这种情况下,一般要修改业务逻辑或改写SQL才能解决SQL执行 ...

  3. Xamarin 开发过的那些项目

    您可能已经看到类似的统计数据:智能手机用户在手机媒体上花费了89%的时间使用应用程序.或者听说Gartner预测到2017年移动应用程序下载将产生价值770亿美元的收入.很难不考虑这些数字.今天,每个 ...

  4. web 项目运用通用的xml配置

    jdk10的转换: <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncod ...

  5. 基于udp简单聊天的系统

    老师博客:http://www.cnblogs.com/Eva-J/articles/8244551.html#_label4 基于udp的简单的聊天代码 说明:这段代码,显示有client向serv ...

  6. luffy项目后台drf搭建(1)

    一 进入虚拟环境 打开crm,输入命令 workon luffy 虚拟环境使用文档 二 安装基本类库 pip install django pip install PymySQL pip instal ...

  7. WPFの命中测试

    概述:  WPF中的Canvas是常用的一个绘图控件,可以方便地在Canvas中添加我们需要处理的各种元素如:图片.文字等.但Canvas中元素增加到一定数量,并且有重合的时候,我们如何通过在Canv ...

  8. Vue 自定义一个插件的用法、小案例及在项目中的应用

    1.开发插件 install有两个参数,第一个是Vue构造器,第二个参数是一个可选的选项对象   MyPlugin.install = function (Vue, options) {   // 1 ...

  9. C++ 既有约定

    Pascal 拼写法: 函数名MultiplyNumbers(),每个单词的首字母都大写 驼峰拼写法: 变量名 firstNumber,第一个单词的首字母采用小写 匈牙利表示法: iFirstNumb ...

  10. 百度杯”CTF比赛 九月场 123

    进去后让登录,先看源码有提示 进到user.php 后发现是空的,看了wp才知道,有bak 下载下来直接爆破 但是那个1990是蛮骚的 直接进去登录 登录成功后是空的,走fd看看是怎么过 的 改包然后 ...