CF 1064 D. Labyrinth
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的更多相关文章
- Codeforces 1064 D - Labyrinth
D - Labyrinth 对于位置(i,j), j - c = R - L = const(常数), 其中R表示往右走了几步,L表示往左走了几步 所以R越大, L就越大, R越小, L就越小, 所以 ...
- CF D. Labyrinth 01BFS
由于上下走不限制,所以按照贪心,我们应该尽可能走上下方向. 我们可以开一个双端队列,并认为每次提取队首的时候得到的是到达该点的最优策略.(这个一定是唯一的,因为不可能向右走几格,然后再退回去. ) 那 ...
- CF 1063B Labyrinth
传送门 解题思路 看上去很简单,\(bfs\)写了一发被\(fst\)...后来才知道好像一群人都被\(fst\)了,这道题好像那些每个点只经过一次的传统\(bfs\)都能被叉,只需要构造出一个一块一 ...
- Labyrinth(记忆化BFS)
Labyrinth http://codeforces.com/problemset/problem/1064/D time limit per test 2 seconds memory limit ...
- Codeforces Round #516 (Div. 2)D. Labyrinth
D. Labyrinth 题目链接:https://codeforces.com/contest/1064/problem/D 题意: 给出一个n*m的矩阵以及人物的起点,并且给出x,y,分别代表这个 ...
- 题解 CF1063B 【Labyrinth】
题解 CF1063B [Labyrinth] 完了我发现我做CF的题大部分思路都和别人不一样qwq 这道题其实很水,不至于到紫题 我们只要bfs一下,向四个方向剪下枝,就A了(好像还跑的蛮快?) 是一 ...
- 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 ...
- cf之路,1,Codeforces Round #345 (Div. 2)
cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅..... ...
- cf Round 613
A.Peter and Snow Blower(计算几何) 给定一个点和一个多边形,求出这个多边形绕这个点旋转一圈后形成的面积.保证这个点不在多边形内. 画个图能明白 这个图形是一个圆环,那么就是这个 ...
随机推荐
- python process,queue
#-*- coding:utf-8 -*- from multiprocessing import Process,Queue import os,time,random def write(q): ...
- 最大传输单元MTU
http://baike.baidu.com/link?url=mU41JFjZzOb3R5crQFCNdocT5ovAswcoIqL2A4U6O5Re_U0-HIYndHG0vSKwc6HbptvH ...
- 【jQuery】deferred对象了解
deferred对象就是jQuery的回调函数解决方案,在英语中,defer的意思是"延迟",所以deferred对象的含义就是"延迟"到未来某个点再执行. 它 ...
- Spring(六)之自动装配
一.自动装配模型 下面是自动连接模式,可以用来指示Spring容器使用自动连接进行依赖注入.您可以使用元素的autowire属性为bean定义指定autowire模式. 可以使用 byType 或者 ...
- Selenium自动化测试之启动浏览器
Selenium自动化测试之启动浏览器 一.Eclipse新建java工程 1.新建java工程:File->New->Java Project,输入Project name:如AutoT ...
- datatable的excel导入,其中有关于datatables的很多参数设置
datatable的excel导入,其中有关于datatables的很多参数设置 http://www.cnblogs.com/liyuhuan/p/5633095.html
- nRF5 SDK for Mesh(八) Exploring Mesh APIs using light switch example,使用 灯开关 案例探索BLE mesh 的APIS
Exploring Mesh APIs using light switch example The light switch example is meant to showcase the API ...
- node.js环境下写的vue项目
github地址:https://github.com/anxizhihai/JournalismProject.git
- Linux文件描述符
在Linux通用I/O模型中,I/O操作系列函数(系统调用)都是围绕一个叫做文件描述符的整数展开.这不禁让人产生疑问:这个整数代表什么?一个数值代表一个文件吗?随便传一个整数进去调用可以吗? 原文地址 ...
- 常用LLDB指令
print.p: 打印内存地址 po: 打印对象 1.读取内存 memory read/数量格式字节数 内存地址 x/数量格式字节数 内存x/3xw 0x10010 格式:x是16进制,f是浮点, ...