CF1063B Labyrinth
大家一起膜Rorshach。
一般的$bfs$会造成有一些点访问不到的情况,在$system\ test$的时候会$WA40$(比如我……)。
发现这张地图其实是一个边权只有$0/1$的图,我们需要计算的是从$(r, c)$开始到每一个点的最短路,因为边权只有两种的特性,我们可以用一个双端队列,每一次向上向下走的放在队首,每一次向左向右走放在队尾,就可以得到正确的解。
也可以用优先队列,这样子多一个$log$。
时间复杂度$O(n^2)$。
Code:
#include <cstdio>
#include <cstring>
#include <deque>
#include <iostream>
using namespace std; const int N = ;
const int dx[] = {, , , -};
const int dy[] = {, , -, }; int n, m, r, c, lstp, rstp, ans = ;
bool vis[N][N];
char mp[N][N]; struct Node {
int x, y, ls, rs; inline Node(int nowX = , int nowY = , int nowLs = , int nowRs = ) {
x = nowX, y = nowY, ls = nowLs, rs = nowRs;
} };
deque <Node> Q; inline bool valid(Node now) {
return now.x >= && now.x <= n && now.y >= && now.y <= m && mp[now.x][now.y] != '*' && !vis[now.x][now.y];
} void bfs() {
Q.push_front(Node(r, c, lstp, rstp));
vis[r][c] = , ++ans;
for(; !Q.empty(); ) {
Node out = Q.front(); Q.pop_front();
for(int i = ; i < ; i++) {
Node in = Node(out.x + dx[i], out.y + dy[i], out.ls - (dy[i] == -), out.rs - (dy[i] == ));
if(!valid(in)) continue;
if(in.ls == - || in.rs == -) continue;
if(i == || i == ) Q.push_back(in);
else Q.push_front(in);
vis[in.x][in.y] = , ++ans;
}
}
} int main() {
scanf("%d%d%d%d%d%d", &n, &m, &r, &c, &lstp, &rstp);
for(int i = ; i <= n; i++) scanf("%s", mp[i] + ); bfs(); /* for(int i = 1; i <= n; i++, printf("\n"))
for(int j = 1; j <= m; j++)
printf("%d ", vis[i][j]); */ printf("%d\n", ans);
return ;
}
CF1063B Labyrinth的更多相关文章
- cf1063B Labyrinth (bfs)
可以证明,如果我搜索的话,一个点最多只有两个最优状态:向左剩余步数最大时和向右剩余步数最大时 然后判一判,bfs就好了 dfs会T惨... #include<bits/stdc++.h> ...
- $CF1063B\ Labyrinth$ $01$最短路/$01BFS$
\(Des\) 有一个网格图,上面的格子分为空地和障碍,障碍是不可以走的.现在从给定的起点出发开始到处乱走,最多可以往左走\(l\)次,往右走\(r\)次.求可能到达的点数. \(Sol\) 如果只限 ...
- 题解 CF1063B 【Labyrinth】
题解 CF1063B [Labyrinth] 完了我发现我做CF的题大部分思路都和别人不一样qwq 这道题其实很水,不至于到紫题 我们只要bfs一下,向四个方向剪下枝,就A了(好像还跑的蛮快?) 是一 ...
- 【极值问题】【CF1063B】 Labyrinth
传送门 Description 给你一个\(n~\times~m\)的矩阵,一开始你在第\(r\)行第\(c\)列.你的上下移动不受限制,向左最多移动\(x\)次,向右最多移动\(y\)次.求你最多能 ...
- 2014百度之星资格赛 1004:Labyrinth(DP)
Labyrinth Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- ural 1145. Rope in the Labyrinth
1145. Rope in the Labyrinth Time limit: 0.5 secondMemory limit: 64 MB A labyrinth with rectangular f ...
- [POJ1383]Labyrinth
[POJ1383]Labyrinth 试题描述 The northern part of the Pyramid contains a very large and complicated labyr ...
- timus 1033 Labyrinth(BFS)
Labyrinth Time limit: 1.0 secondMemory limit: 64 MB Administration of the labyrinth has decided to s ...
- poj 1383 Labyrinth
题目连接 http://poj.org/problem?id=1383 Labyrinth Description The northern part of the Pyramid contains ...
随机推荐
- UVA - 1610 Party Games (字符串比较)
给你n(n为偶数)个字符串,让你找出一个长度最短且字典序尽量小的字符串,使得一半的字符串小于等于该串,一半的字符串大于该串. 紫薯上说这道题有坑,但其实思路对了就没什么坑. 很明显,只要取夹在中间两个 ...
- HihoCoder1366 逆序单词(字典树)
逆序单词 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在英文中有很多逆序的单词,比如dog和god,evil和live等等. 现在给出一份包含N个单词的单词表,其中每 ...
- CH5702 Count The Repetitions[倍增dp]
http://contest-hunter.org:83/contest/0x50%E3%80%8C%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E3%80%8D%E4%B ...
- Linux网络编程学习路线
转载自:https://blog.csdn.net/lianghe_work/article 一.网络应用层编程 1.Linux网络编程01——网络协议入门 2.Linux网络编程02——无连接和 ...
- 记一次内存溢出的分析经历——使用thrift
背景: 有一个项目做一个系统,分客户端和服务端,客户端用c++写的,用来收集信息然后传给服务端(客户端的数量还是比较多的,正常的有几千个), 服务端用Java写的(带管理页面),属于RPC模式,中间的 ...
- Springboot正常启动,但是访问404报错
原因: 查看是否配置文件中有以下配置: server.context-path=/hellopath 我这里是以/hellopath为例,如果有该配置的话,只能通过该路径访问到. 其他原因
- mongo之map-reduce笔记
package com.sy.demo; import com.mongodb.MongoClient; import com.mongodb.client.FindIterable; import ...
- maven打包指定main函数的入口,生成依赖的包
为了使Jar包中指定Main方法位置和生成依赖包,需要在pom文件中加入如下配置: <build> <plugins> <plugin> <groupId&g ...
- springboot实现定时任务的一种方式
参考:https://www.yoodb.com/news/detail/1205 目前觉得这种还是很好用,所以就记录. 最好新建一个项目测试: 1. pom中添加 <dependency> ...
- Generate web.xml deployment descriptor
eclipse 使用tomcat7.0建立Dynamic Web Project 时,next至步骤“Web Module”,此时勾选选项“Generate web.xml deployment de ...