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. PhoneGap检测设备网络连接情况

    一.网络连接状态列表 Phonegap 网络连接通过 navigator.network.connection.type 来获取,一般有一下几种状态 1. Connection.UNKNOWN     ...

  2. Ubuntu root 密码忘记-恢复

    @Ubuntu root 密码忘记-恢复 2012-04-27 11:09:22 方法一: 如果用户具有sudo权限,那么直接可以运行如下命令: #sudo su root #passwd #更改密码 ...

  3. size和len

    size函数只能用于计算array,不能用于计算list,返回的是数组的元素个数 len函数既可以计算array,也可以计算list >>> a = np.array([1,2]) ...

  4. windows下搭建nginx+php开发环境

    windows下搭建nginx+php开发环境 1.前言 windows下大多我们都是下载使用集成环境,但是本地已经存在一个集成环境,但不适合项目的需求.因此准备再自己搭建一个环境. 2.准备 工具: ...

  5. ThinkPHP5入门(二)----控制器篇

    一.控制器访问 1.命名空间 命名空间与目录路径对应. 如:路径位置为:application/index/controller/Index.php 其文件的命名空间应为:app\index\cont ...

  6. ThinkPHP里面用原生SQL

    public function rewardlog(){ $adminNav = C('ADMIN_NAV'); $adminNav[1]['class'] = 'cur'; $this->as ...

  7. PAT——1031. 查验身份证

    一个合法的身份证号码由17位地区.日期编号和顺序编号加1位校验码组成.校验码的计算规则如下: 首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8, ...

  8. Jenkins+Ant+Jmeter接口自动化集成测试实例

    Jenkins+Ant+Jmeter接口自动化集成测试实例 一.Jenkins安装配置 1.安装配置JDK1.6+环境变量: 2.下载jenkins.war,放入C:\jenkins目录下,目录位置随 ...

  9. Java语言实现通过Ajax抓取后台数据及图片

    1.Java语言实现通过Ajax抓取后台数据及图片信息 1.1数据库设计: create table picture( pic_id number not null, pic_name )not nu ...

  10. ansible批量修改用户密码

    实现批量修改目标主机多个用户密码: --- - hosts: testchanange passwd gather_facts: false tasks: - name: change you pas ...