题意

题目链接

给出一个\(n \times m\)的网格,给出起始点,要求向左走不超过\(L\)步,向右走不超过\(R\)步,求出能遍历到哪些点

Sol

一个很直观的想法,BFS的时候状态里记录下还能向左 / 右走多少步,然后xjbBFS,恭喜你fst了。。

正解非常的巧妙:

可以这样想:如果我们保证了到达一个点时向左走的次数最少,那么是不是也可以保证向右走的次数最少呢?

答案是肯定的,因为向右走了一次之后肯定需要向左走一次来抵消掉这次操作

向右同理

把向左/右的边权看成1,向上/下的边权看成0,一波SPFA01BFS

#include<bits/stdc++.h>
const int MAXN = 2001;
int N, M, r, c, X, Y, vis[MAXN][MAXN], ans, xx[4] = {-1, +1, 0, 0}, yy[4] = {0, 0, -1, +1};
char s[MAXN][MAXN];
struct Node {
int x, y, l, r;
};
main() {
std::cin >> N >> M >> r >> c >> X >> Y;
for(int i = 1; i <= N; i++) scanf("%s", s[i] + 1);
std::deque<Node> q; q.push_back((Node) {r, c, X, Y});
while(!q.empty()) {
Node p; p = q.front(); q.pop_front();
if(vis[p.x][p.y] || (p.l < 0) || (p.r < 0)) continue;
vis[p.x][p.y] = 1; ans++;
for(int i = 0; i < 4; i++) {
int wx = p.x + xx[i], wy = p.y + yy[i];
if(wx < 1 || wx > N || wy < 1 || wy > M || (s[wx][wy] == '*') || (vis[wx][wy])) continue;
if(i == 0 || i == 1) {q.push_front((Node) {wx, wy, p.l, p.r}); continue;}
if(i == 2) {q.push_back((Node) {wx, wy, p.l - 1, p.r}); continue;}
if(i == 3) q.push_back((Node) {wx, wy, p.l, p.r - 1});
}
}
printf("%d", ans);
}

cf1064D. Labyrinth(01BFS)的更多相关文章

  1. CF D. Labyrinth 01BFS

    由于上下走不限制,所以按照贪心,我们应该尽可能走上下方向. 我们可以开一个双端队列,并认为每次提取队首的时候得到的是到达该点的最优策略.(这个一定是唯一的,因为不可能向右走几格,然后再退回去. ) 那 ...

  2. NOIP前刷题记录

    因为本蒻实在太蒻了...对于即将到来的NOIP2018ssfd,所以下决心要把自己近期做过的题目(衡量标准为洛谷蓝题难度或以上)整理一下,归归类,简单地写一下思路,就当作自己复习了吧qwq 本随笔持续 ...

  3. NOIP刷题

    搜索 [NOIP2013]华容道 最短路+带剪枝的搜索,是一个思维难度比较大的题目. CF1064D Labyrinth 考虑贪心,用双向队列bfs [NOIP2017]宝藏 剪枝搜索出奇迹 题解:h ...

  4. $CF1063B\ Labyrinth$ $01$最短路/$01BFS$

    \(Des\) 有一个网格图,上面的格子分为空地和障碍,障碍是不可以走的.现在从给定的起点出发开始到处乱走,最多可以往左走\(l\)次,往右走\(r\)次.求可能到达的点数. \(Sol\) 如果只限 ...

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

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

  6. CF 1064 D. Labyrinth

    D. Labyrinth http://codeforces.com/contest/1064/problem/D 题意: n*m的矩阵,只能往左走l次,往右走r次,上下走无限制,问能走到多少个点. ...

  7. 2014百度之星资格赛 1004:Labyrinth(DP)

    Labyrinth Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  8. ural 1145. Rope in the Labyrinth

    1145. Rope in the Labyrinth Time limit: 0.5 secondMemory limit: 64 MB A labyrinth with rectangular f ...

  9. [POJ1383]Labyrinth

    [POJ1383]Labyrinth 试题描述 The northern part of the Pyramid contains a very large and complicated labyr ...

随机推荐

  1. github for windows安装以及教程

    更多资料,欢迎访问我的网站 Git是一个分布式的版本控制系统,最初由Linus Torvalds编写,用作Linux内核代码的管理.在推出后,Git在其它项目中也取得了很大成功,尤其是在Ruby社区中 ...

  2. SDUT OJ 多项式求和

    多项式求和 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Description 多项式描述 ...

  3. win7/win8/win10 系统

    WIN7/WIN8/WIN10 系统安装 http://www.windows7en.com/Win7/18572.html

  4. struts2学习笔记(一)—— struts2介绍及入门程序

    一.struts2概述 1.1 什么是struts2? 在介绍Struts2之前,先来认识一下Struts1.Struts1是最早的基于MVC模式的轻量级web框架,他能够合理的划分代码结构,并包含了 ...

  5. springMVC上传功能(单文件和多文件上传)

    单文件和多文件上传 首先在xxx-select.xml里面配置上传的大小和编码 <bean id="multipartResolver" class="org.sp ...

  6. perl中一些模块的ubuntu中依赖包

    GD 先更新系统中的依赖包: sudo apt-get update sudo apt-get upgrade 进入 cpan> install GD 会提示没有安装libgd模块. 所以,先需 ...

  7. LeetCode153.寻找旋转排序数组中的最小值

    153.寻找旋转排序数组中的最小值 描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 请找出 ...

  8. ui-grid使用详解

    HTML <pre name="code" class="html"><!--ui-grid css--> <link rel=& ...

  9. MVC4设置伪静态---路由伪静态

    有些客户要求设置静态的,为了完成需求,而且更简单的做法就是设置伪静态,例如:http://localhost:80/Home/Index.html ,也可以访问http://localhost:80/ ...

  10. CFD

                                                        Were  it free , it would Soar , cloud Sky. 1. 明显 ...