题意

题目链接

给出一个\(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. VSLAM技术框架详述

    最早的SLAM雏形是在军事(核潜艇的海底定位)上的应用,主要传感器是军用雷达.SLAM技术发展到如今已经几十年,目前以激光雷达作为主传感器的SLAM技术比较稳定.可靠,仍然是主流的技术方案.但随着最近 ...

  2. java 连接 Redis

    使用 jedis-2.9.0.jar 包 连接 Docker 中的 Redis 容器. package redisTest; /** * @Author:YangLianjun * @Descript ...

  3. BCH code

    简单介绍 若循环码的生成多项式具有如下形式\(g(x)=LCM[m_{1}(x),m_{3}(x)..m_{2t-1}(x)]\) 其中LCM表示最小公倍式,t为纠错个数,\(m_{i}(x)\)为素 ...

  4. Hibernate 环境配置和依赖添加(使用java web和普通javaSE工程)

    1.Hibernate依赖包的添加 File---->Project Structure,按照如图所示操作,导入所依赖的jar包. 2.生成hibernate.hbm.xml的配置文件 (1)点 ...

  5. 老男孩python作业7-开发一个支持多用户在线的FTP程序

    作业6:开发一个支持多用户在线的FTP程序 要求: 用户加密认证 允许同时多用户登录 每个用户有自己的家目录 ,且只能访问自己的家目录 对用户进行磁盘配额,每个用户的可用空间不同 允许用户在ftp s ...

  6. C++_友元2-友元成员函数

    接着上一篇<友元是什么>中,我们发现Remote友元类的大多数方法都是用Tv类的公有接口实现.这意味着这些方法并不是真正需要友元. 事实上唯一直接访问Tv成员的Remote方法是Remot ...

  7. [BZOJ 5415] 归程

    一棵KrusKal重构树,然而我数组开小了,忘记清空一个标记 洛谷传送门 BZOJ传送门 ......好像成权限题了Orz 回顾我们用KrusKal做生成树的时候,我们将边排序后连通各个连通块,那么边 ...

  8. redis设置允许远程连接

    #redis默认只允许本地访问# #根据自己的配置文件启动,linux环境下同理# #远程访问的话需要设置配置文件,在redis安装根目录下xxx.config# #修改三个地方# 地址绑定 保护模式 ...

  9. C. Magic Ship (思维+二分)

    https://codeforces.com/contest/1117/problem/C 你是一个船长.最初你在点 (x1,y1) (显然,大海上的所有点都可以用平面直角坐标描述),你想去点 (x2 ...

  10. Python异常基础

    一.常见异常及场景举例 1.AssertionError 断言失败,断言是调试中常用(表示自己并不常用┑( ̄Д  ̄)┍)手段 举例: def foo(s): n = int(s) assert n ! ...