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

题目翻译

给你一个\(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. EventBus中观察者模式的应用

    一 介绍 EventBus是一款安卓的开源消息传递框架,地址:https://github.com/greenrobot/EventBus android系统的消息传递非常复杂,比如activity和 ...

  2. Typora 快捷键

    今天学习了一下这个工具.很轻便,很好用的. 无序列表:输入-之后输入空格 有序列表:输入数字+“.”之后输入空格 任务列表:-[空格]空格 文字 标题:ctrl+数字 表格:ctrl+t 生成目录:[ ...

  3. Linux中VSFTP的配置

    配置VSFTP服务器: 1.安装VSFTP,可以参考Linux 中yum的配置来安装: yum installvsftpd.x86_64 -y 2.修改SELinux: setenforce 0 查看 ...

  4. c/c++ 多线程 mutex的理解

    多线程 mutex的理解 mutex,我的理解是每个mutex对象都是一个带锁头的门,这个门有两个状态,门开着和门关着,感觉像是废话... 当想查看门的里东西,或者把东西放进门里,或者从门里拿出东西前 ...

  5. c/c++ 网络编程 UDP up/down 网卡

    网络编程 UDP up/down 网卡 在程序里动态改变网卡的状态.注意:程序运行需要root权限. 程序运行的方法: sudo ./a.out 1,关闭网卡 #include <stdio.h ...

  6. python3操作MySQL数据库,一次插入多条记录的方法

    这里提供一个思路,使用字符串拼接的方法,将sql语句拼接出来,然后去执行: l = ["] s = '-' print(s.join(l))

  7. 指定IP地址进行远程访问服务器设置方法(windows系统)

    我们有很多服务器经常受到外界网络的干扰,入侵者们通过扫描3389端口爆破密码非法进入我们的服务器,这时,我们可以配置服务器IP 安全策略来限制一些IP访问,大大提高了服务器的安全. 实验环境:     ...

  8. SQLServer之添加聚集索引

    聚集索引添加规则 聚集索引按下列方式实现 PRIMARY KEY 和 UNIQUE 约束 在创建 PRIMARY KEY 约束时,如果不存在该表的聚集索引且未指定唯一非聚集索引,则将自动对一列或多列创 ...

  9. LivePhoto开发,你要知道的知识点

    前言 Apple从iPhone6s开始支持Live Photo.Live Photo 会录下拍照前后 1.5 秒所发生的一切,因此用户获得的不仅仅是一张精美照片,还有拍照前后时刻的动作和声音.具体的操 ...

  10. Linux-基础学习(三)-Nginx学习

    1.nginx安装与部署 1.1 nginx入门 Web 网络服务是一种被动访问的服务程序,即只有接收到互联网中其他主机发出的 请求后才会响应,最终用于提供服务程序的 Web 服务器会通过 HTTP( ...