Luogu P2243 电路维修 双端队列BFS
当转移的代价是0和一个分明不同的权值时,可以用双端队列BFS去跑(你跑最短路也没问题。。QWQ)
而对于这道题,边旋转代价是1,不旋转代价是0;可以直接建图最短路,也可以跑BFS
这个题建图很有意思:如果是' \ '就在mp上记录:1,反之 ' / '在上面记录为0
至于如何用:如果一个点在左上,一个点在右下,那么把mp取个非就是代价,即 \ 在mp中为1,我们用时要把它变成0,而 / 在mp中为0,用的时候变成1
如果一个点在右上,一个点在左下,那么代价就是mp的值
剩下就直接BFS就好了。。注意方向的常量数组,别写错,是向四个角扩展,而不是上下左右QWQ写到最后才发现。。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#define P pair<int,int>
#define PP pair<pair<int,int>,pair<int,int> >
#define mkp make_pair
#define R register int
const int dx[]={-,,-,},dy[]={,-,-,};
using namespace std;
const int M=;
int t,r,c; int d[M][M];
bool vis[M][M],mp[M][M];
char s[M];
deque<PP > q;
inline int g() {
R ret=,fix=; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-:fix;
do ret=ret*+(ch^); while(isdigit(ch=getchar())); return ret*fix;
}
inline bool ckpos(int x,int y) {return x<||y<||x>r+||y>c+; }
inline int w(int x,int xx,int y,int yy) {
if((xx<x&&yy<y)||(xx>x&&yy>y)) return !mp[min(x,xx)][min(y,yy)];
else return mp[min(x,xx)][min(y,yy)];
}
inline void bfs() {
mp[][]=; P u=mkp(,),v=mkp(,);
q.push_back(mkp(u,v)); d[][]=;
while(q.size()) {
PP t=q.front(); q.pop_front();
P u=t.first; P v=t.second; R xx=u.first,yy=u.second,x=v.first,y=v.second;
if(vis[x][y]) continue; vis[x][y]=true; d[x][y]=d[xx][yy]+w(x,xx,y,yy);
for(R i=;i<;++i) {
R vx=x+dx[i],vy=y+dy[i];
P s=mkp(vx,vy); if(ckpos(vx,vy)||vis[vx][vy]) continue;
if(w(vx,x,vy,y)) q.push_back(mkp(v,s)); else q.push_front(mkp(v,s));
}
}
}
signed main() {
t=g();
while(t--) {
memset(d,,sizeof(d)),memset(vis,,sizeof(vis));
r=g(),c=g();
for(R i=;i<=r;++i) {
scanf("%s",s+);
for(R j=;j<=c;++j) if(s[j]=='\\') mp[i][j]=;
else mp[i][j]=;
} bfs();
if(vis[r+][c+]) printf("%d\n",d[r+][c+]);
else printf("NO SOLUTION\n");
}
}
2019.04.26
Luogu P2243 电路维修 双端队列BFS的更多相关文章
- CH 2601 - 电路维修 - [双端队列BFS]
题目链接:传送门 描述 Ha'nyu是来自异世界的魔女,她在漫无目的地四处漂流的时候,遇到了善良的少女Rika,从而被收留在地球上.Rika的家里有一辆飞行车.有一天飞行车的电路板突然出现了故障,导致 ...
- CH2601 电路维修(双端队列bfs)建图恶心
CH2601 电路维修 双端队列bfs,其实就是因为只有0和1所以可以直接2维护队列单调性(和优先队列一个道理) 建图的过程需要仔细斟酌(想一想id为什么这么写) 还有,空间要开够(很玄学),我一开始 ...
- 电路维修 (广搜变形-双端队列bfs)
# 2632. 「BalticOI 2011 Day1」打开灯泡 Switch the Lamp On [题目描述] 有一种正方形的电路元件,在它的两组相对顶点中,有一组会用导线连接起来,另一组则不会 ...
- codeforces 1064D 双端队列BFS
双端队列BFS解决的就是路径权值可能为0的图最短路问题,权值为0插入队头,否则插入队尾. 对于这个题,可以看作上下移动的路径的权值为0,左右移动权值为1,而且不能超过规定的步数. 直接广搜求覆盖的点的 ...
- 2601 电路维修 (双端队列bfs\优先队列bfs(最短路))
描述 Ha'nyu是来自异世界的魔女,她在漫无目的地四处漂流的时候,遇到了善良的少女Rika,从而被收留在地球上.Rika的家里有一辆飞行车.有一天飞行车的电路板突然出现了故障,导致无法启动. 电路板 ...
- POJ 3662 Telephone Lines【二分答案+最短路】||【双端队列BFS】
<题目链接> 题目大意: 在一个节点标号为1~n的无向图中,求出一条1~n的路径,使得路径上的第K+1条边的边权最小. 解题分析:直接考虑情况比较多,所以我们采用二分答案,先二分枚举第K+ ...
- HDU - 6386 Age of Moyu (双端队列+bfs)
题目链接 双端队列跑边,颜色相同的边之间的花费为0,放进队首:不同的花费为1,放进队尾. 用Dijkstra+常数优化也能过 #include<bits/stdc++.h> using n ...
- P4554 小明的游戏 (洛谷) 双端队列BFS
最近没有更新博客,全是因为英语,英语太难了QWQ 洛谷春令营的作业我也不会(我是弱鸡),随机跳了2个题,难度不高,还是讲讲吧,学学新算法也好(可以拿来水博客) 第一题就是这个小明的游戏 小明最近喜欢玩 ...
- Codeforces 1064D Labyrinth(双端队列BFS)
题意: 给一个图,"*"不可以走,给你一个起点,限制向左走L次,向右走R次,上下不限制,问你最多可以走到多少个格子 思路: BFS,每次将上下走的策略加入队首,左右加入队尾,(相当 ...
随机推荐
- Android selector中的item的顺序
在selector中,要将默认状态的item放在最后面,因为一旦前面的item满足匹配条件,后面的item就不会去匹配.因此,把默认状态的item放在前面的话,后面的item没有执行的机会
- 反射01 Class类的使用、动态加载类、类类型说明、获取类的信息
0 Java反射机制 反射(Reflection)是 Java 的高级特性之一,是框架实现的基础. 0.1 定义 Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对 ...
- 面试题:MySQL性能调优——索引详解与索引的优化 没用
——索引优化,可以说是数据库相关优化.理解尤其是查询优化中最常用的优化手段之一.所以,只有深入索引的实现原理.存储方式.不同索引间区别,才能设计或使用最优的索引,最大幅度的提升查询效率! 一.BTre ...
- eclipse——配置maven插件
Step 1 配置installations installations:指定Maven核心程序的位置 从本地磁盘中找到本地maven的位置 Step 2 配置user settings user ...
- 函数有一个特殊的属性 prototype!
JavaScript 中只有对象,没有类. 实际上,JavaScript 才是真正应该被称为「面向对象」的语言,因为它是少有的可以不通过类,直接创建对象的语言. 函数的 prototype 属性 在 ...
- 用maven将项目安装到本地仓库,为什么老是在默认仓库地址(C:\Users\userName\.m2\repository)
使用mvn clean install安装项目到本地的时候,在idea中配置好了本地仓库地址,见下图: 但是安装时,还是安装到了C:\Users\userName\.m2\repository路径下, ...
- Ubuntu安装开发版pidgin支持lwqq插件
sudo add-apt-repository ppa:lainme/pidgin-lwqq """添加pidgin-lwqq源""" s ...
- poj2513 Fence Repair(小根堆)
Description Farmer John wants to repair a small length of the fence around the pasture. He measures ...
- OM—>AR相关会计科目
业务会计核算 挑库: 借:发出商品 (递延销货成本) 贷:发出商品 (递延销货成本) 发运: 借:发出商品 (递延销货成本) 贷:库存商品/原材料 (库存估 ...
- SqlServer删除重复数据的方法
方法一 declare @max integer,@id integer open cur_rows fetch cur_rows into @id,@max begin set rowcount @ ...