D. Labyrinth

http://codeforces.com/contest/1064/problem/D

题意:

  n*m的矩阵,只能往左走l次,往右走r次,上下走无限制,问能走到多少个点。

分析:

  01bfs。

  直接bfs会出现问题,因为一旦打上标记后,下一次无法访问到,但是下一次的状态还更优。

像这样的样例:

.....
.***.
...*.
*.**.
*.**.
*....

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

引用自:dummyummy

0-1BFS用来解决:边权值为0或1,或者能够转化为这种边权值的最短路问题,时间复杂度为O(E+V).

0-1BFS,从队列front中去除点u,遍历u的所有边,如果当前边可以进行relax操作,则relax,然后判断level,若level相同,放到队列的front,否则,放到back,队列采用双端队列deque。

实际上跟最短路挺像。 另外:由于松弛操作的存在,0-1bfs可以去掉vis数组,而且速度会更快。

引用自:R灬O灬J

代码:

 /*
* @Author: mjt
* @Date: 2018-10-16 21:52:39
* @Last Modified by: mjt
* @Last Modified time: 2018-10-16 23:03:39
*/
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<iostream>
#include<cctype>
#include<set>
#include<vector>
#include<queue>
#include<map>
#define fi(s) freopen(s,"r",stdin);
#define fo(s) freopen(s,"w",stdout);
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} const int N = ; struct Node{
int x, y, l, r;
Node() {}
Node(int _1,int _2,int _3,int _4) { x = _1, y = _2, l = _3, r = _4; }
}; int n, m, sx, sy, L, R;
bool vis[N][N];
char s[N][N];
deque <Node> q; int dx[] = {, -, , };
int dy[] = {, , , -}; void bfs() {
vis[sx][sy] = ;
q.push_front(Node(sx, sy, L, R));
while (!q.empty()) {
Node now = q.front(); q.pop_front();
for (int i=; i<; ++i) {
int x = now.x + dx[i], y = now.y + dy[i];
if (x >= && x <= n && y >= && y <= m && !vis[x][y] && s[x][y] == '.') {
if (i == || i == ) vis[x][y] = , q.push_front(Node(x, y, now.l, now.r)); // vis的位置!!!
else if (i == && now.r) vis[x][y] = , q.push_back(Node(x, y, now.l, now.r - ));
else if (i == && now.l) vis[x][y] = , q.push_back(Node(x, y, now.l - , now.r));
}
}
}
}
int main() {
n = read(), m = read(), sx = read(), sy = read(), L = read(), R = read();
for (int i=; i<=n; ++i) scanf("%s", s[i] + );
bfs();
int ans = ;
for (int i=; i<=n; ++i)
for (int j=; j<=m; ++j) ans += vis[i][j];
cout << ans;
return ;
}

CF 1064 D. Labyrinth的更多相关文章

  1. Codeforces 1064 D - Labyrinth

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

  2. CF D. Labyrinth 01BFS

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

  3. CF 1063B Labyrinth

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

  4. Labyrinth(记忆化BFS)

    Labyrinth http://codeforces.com/problemset/problem/1064/D time limit per test 2 seconds memory limit ...

  5. Codeforces Round #516 (Div. 2)D. Labyrinth

    D. Labyrinth 题目链接:https://codeforces.com/contest/1064/problem/D 题意: 给出一个n*m的矩阵以及人物的起点,并且给出x,y,分别代表这个 ...

  6. 题解 CF1063B 【Labyrinth】

    题解 CF1063B [Labyrinth] 完了我发现我做CF的题大部分思路都和别人不一样qwq 这道题其实很水,不至于到紫题 我们只要bfs一下,向四个方向剪下枝,就A了(好像还跑的蛮快?) 是一 ...

  7. ORA-00494: enqueue [CF] held for too long (more than 900 seconds) by 'inst 1, osid 5166'

    凌晨收到同事电话,反馈应用程序访问Oracle数据库时报错,当时现场现象确认: 1. 应用程序访问不了数据库,使用SQL Developer测试发现访问不了数据库.报ORA-12570 TNS:pac ...

  8. cf之路,1,Codeforces Round #345 (Div. 2)

     cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅.....   ...

  9. cf Round 613

    A.Peter and Snow Blower(计算几何) 给定一个点和一个多边形,求出这个多边形绕这个点旋转一圈后形成的面积.保证这个点不在多边形内. 画个图能明白 这个图形是一个圆环,那么就是这个 ...

随机推荐

  1. angularJs的过滤器扩展及自定义过滤器

    一.过滤器扩展 1.过滤器的组合使用 <!DOCTYPE HTML> <html ng-app="myApp"> <head> <meta ...

  2. ERROR: Repository not found. ////Git, but is not registered in the Settings.

    1.ERROR: Repository not found. 这个问题是因为在你推送的github账户中,并没有这个Repository. 解决方法: 1)检查自己的github中的Repositor ...

  3. 「bzoj 4184: shallot」

    权限题 线段树分治加线性基 首先这个题要求删除线性基肯定是没法处理的 于是我们套上一个线段树分治 线段树分治就是一种能够避免删除的神仙操作 我们发现询问是对一个时间的单点询问,而每一个数存在的时间却是 ...

  4. 【[NOI2011]阿狸的打字机】

    首先发现这个插入的非常有特点,我们可以直接利用这个特殊的性质在\(Trie\)树上模拟指针的进退 之后得到了\(Trie\)树,先无脑建出\(AC\)机 之后考虑一下如何写暴力 最简单的暴力对于每一个 ...

  5. Linux环境搭建多项目SVN

    1.安装SVN #yum install subversion 2.创建版本库文件夹 #mkdir -p /var/svn/repos/pro1 (/var/svn/repos是根路径,pro1是项目 ...

  6. 多线程系列 - 基础篇01 - 线程基本概念 & 线程优先级 & 守护线程 60%

    1.什么是线程 将线程理解为轻量级进程,它与进程的最大的区别是: 多个线程共享一个进程资源: 对于OS的许多资源的分配和管理(如内存)通常都是进程级别的,线程只是os调度的最小单位: 相对于进程来说更 ...

  7. c#将List转换成DataTable(采用Emit)

    前段时间通过网上查找,使用emit将Datatable,DataReader转换成List<T>了.这是从数据库到展示. 但是最近整理Hikari(我写的数据库连接池),发现c#里面数据库 ...

  8. Java类和对象详解,以及相关知识点

    了解类和对象前,简单提及面向对象程序设计.面向对象程序设计就是通过对象来进行程序设计,对象表示一个可以明确标识的实体.例如:一个人.一本书.一个学校或一台电脑等等.每个对象都有自己独特的标识.状态和行 ...

  9. python3爬虫-爬取B站排行榜信息

    import requests, re, time, os category_dic = { "all": "全站榜", "origin": ...

  10. #leetcode刷题之路31-下一个排列

    实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列.如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列).必须原地修改,只允许使用额外常数空间. 以下 ...