AcWing175电路维修
这是一道在luogu的蓝题,在yxc大佬的讲解下AC掉了(百般调试)
首先这道题给了一个字符串矩阵,/ \表示相连哪两个节点,只可以走/ \所连接的两个点,但我们可以旋转每一个边,询问从1,1 走到 n+1,m+1的最小旋转次数。如果到不了就输出no。
首先我们要明确点的坐标和对于点四周的格子上边的坐标。其次我们考虑算法,发现这个边权一个是0,一个是1,并且要搜最小步数,我们考虑狄杰斯特拉发现是可行的,所以这也证明了bfs是正确的,然后对于这种问题我们采用stl_deque来写。对于deque,我们对于每一个点进行dijksra式的扩展,假如这个点作为过front,那么打标记,但入队后不需要打标记,和普通的队列不一样,因为这里存在多次进队的可能。然后运用四个方向数组以及一个正确匹配的边进行判断权值是1还是0,松弛dist[tx][ty],假如松弛成功,我们将其入队,边权为0放到front,边权为1放到back。最后就是特判,假如终点的横纵坐标为奇数,肯定到不了。
1.对于格子图和块图要分清楚,方向数组写好,最后答案,越界判断细心写
2.多组数据,千万别return 0了,特判的放在输入后面,还有memset
3.deque: 权0前1后,打当过head的点标记
代码
#include<bits/stdc++.h>
#define maxn 505
using namespace std;
char mp[maxn][maxn];
bool st[maxn][maxn];
int dist[maxn][maxn];
int n,m;
int xx[maxn],yy[maxn];
int T;
/*int dx[4]={-1,1,-1,1};
int dy[4]={-1,-1,1,1};
int ix[4]={-1,-1,0,0};
int iy[4]={-1,0,-1,0};
char cs[]="\\//\\";*/
char cs[] = "\\/\\/";
int dx[] = {-, -, , }, dy[] = {-, , , -};
int ix[] = {-, -, , }, iy[] = {-, , , -};
struct node{
int x,y;
};
int bfs(){
memset(dist,0x3f,sizeof(dist));
memset(st,false,sizeof(st));
dist[][]=;
deque<node>q;
q.push_back({,});
while(q.size()){
node a=q.front();
q.pop_front();
if(st[a.x][a.y]==true) continue;//只可以被当做一次堆顶
st[a.x][a.y]=true;
for(int i=;i<=;i++){
int tx=a.x+dx[i];
int ty=a.y+dy[i];
if(tx<||ty<||tx>n+||ty>m+) continue;
int gx=a.x+ix[i];
int gy=a.y+iy[i];
int w=;
if(mp[gx][gy]!=cs[i]){
w=;
}
int d=w+dist[a.x][a.y];
if(d<dist[tx][ty]){
dist[tx][ty]=d;
if(w==) q.push_back({tx,ty});//权为1,后插
else q.push_front({tx,ty});//权为0,前插
}
}
}
return dist[n+][m+];
}
int main(){
cin>>T;
while(T--){
cin>>n>>m;
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
cin>>mp[i][j];
}
}
if((n+m)%!=){
cout<<"NO SOLUTION"<<endl;
continue;
}
cout<<bfs()<<endl;
}
return ;
}
AcWing175电路维修的更多相关文章
- P2243 电路维修
P2243 电路维修 题目背景 Elf 是来自Gliese 星球的少女,由于偶然的原因漂流到了地球上.在她无依无靠的时候,善良的运输队员Mark 和James 收留了她.Elf 很感谢Mark和Jam ...
- 洛谷P2243 电路维修 [最短路]
题目传送门 电路维修 题目背景 Elf 是来自Gliese 星球的少女,由于偶然的原因漂流到了地球上.在她无依无靠的时候,善良的运输队员Mark 和James 收留了她.Elf 很感谢Mark和Jam ...
- CH2601 电路维修(双端队列bfs)建图恶心
CH2601 电路维修 双端队列bfs,其实就是因为只有0和1所以可以直接2维护队列单调性(和优先队列一个道理) 建图的过程需要仔细斟酌(想一想id为什么这么写) 还有,空间要开够(很玄学),我一开始 ...
- 洛谷 P2243 电路维修
P2243 电路维修 题目背景 Elf 是来自Gliese 星球的少女,由于偶然的原因漂流到了地球上.在她无依无靠的时候,善良的运输队员Mark 和James 收留了她.Elf 很感谢Mark和Jam ...
- 「CH2601」 电路维修 解题报告
CH2601 电路维修 描述 Ha'nyu是来自异世界的魔女,她在漫无目的地四处漂流的时候,遇到了善良的少女Rika,从而被收留在地球上.Rika的家里有一辆飞行车.有一天飞行车的电路板突然出现了故障 ...
- 2601 电路维修 (双端队列bfs\优先队列bfs(最短路))
描述 Ha'nyu是来自异世界的魔女,她在漫无目的地四处漂流的时候,遇到了善良的少女Rika,从而被收留在地球上.Rika的家里有一辆飞行车.有一天飞行车的电路板突然出现了故障,导致无法启动. 电路板 ...
- CH 2601 - 电路维修 - [双端队列BFS]
题目链接:传送门 描述 Ha'nyu是来自异世界的魔女,她在漫无目的地四处漂流的时候,遇到了善良的少女Rika,从而被收留在地球上.Rika的家里有一辆飞行车.有一天飞行车的电路板突然出现了故障,导致 ...
- AcWing:175. 电路维修(bfs)
达达是来自异世界的魔女,她在漫无目的地四处漂流的时候,遇到了善良的少女翰翰,从而被收留在地球上. 翰翰的家里有一辆飞行车. 有一天飞行车的电路板突然出现了故障,导致无法启动. 电路板的整体结构是一个R ...
- 电路维修(双端队列 & 最短路)
达达是来自异世界的魔女,她在漫无目的地四处漂流的时候,遇到了善良的少女翰翰,从而被收留在地球上. 翰翰的家里有一辆飞行车. 有一天飞行车的电路板突然出现了故障,导致无法启动. 电路板的整体结构是一个$ ...
随机推荐
- 阿里云ECS新增端口
由于本地开多台虚拟机玩集群,发现内存有点吃不消,好奇心的驱使下,买了一台阿里云玩玩,发现外面访问不了端口. 解决: 登陆阿里云网站,进入控制台,点击云服务器ECS 进入服务器控制台,点击要选择的服务器 ...
- matlab中setdiff
源自:http://www.w2bc.com/Article/16709 matlab中setdiff()函数作用:判断2个数组中不同元素 c = setdiff(A, B) 返回在A中有,而B中没有 ...
- 【CUDA 基础】3.2 理解线程束执行的本质(Part I)
title: [CUDA 基础]3.2 理解线程束执行的本质(Part I) categories: CUDA Freshman tags: 线程束分化 CUDA分支 toc: true date: ...
- CodeForces–833B--The Bakery(线段树&&DP)
B. The Bakery time limit per test 2.5 seconds memory limit per test 256 megabytes input standard inp ...
- zookeeper系列(五)zookeeper在大型分布式系统中的应用
作者:leesf 掌控之中,才会成功:掌控之外,注定失败. 出处:http://www.cnblogs.com/leesf456/p/6063694.html 尊重原创感谢博主公开这么好的博文, ...
- Java微信服务号的开发(简单入门)
进行微信服务号开发的步骤 一个别人已经搭建好的项目参考地址:下载链接 1.搭建微信服务号的服务器 项目配置maven <dependency> <groupId>com.soe ...
- 【黑马JavaSE】1.1JavaSE、环境变量、CMD使用、常量、变量、数据类型转换(自动/强制)、ASCII码表、Unicode万国码表
文章目录 SUN公司,詹姆斯.劳瑟琳,Java祖师爷 Java语言开发环境搭建 把Java添加到环境变量的方法 命令行CMD里一些报的错误 命令控制行常用操作的代码展示 Notepad++.注释.标识 ...
- js向input的value赋值
js与jquery:在我印象里面都是一样的,今天利用空闲的时间来总结一下,js与jquery究竟有什么区别? js : 是一门网页的脚本语言 jquery :jquery是基于js的一种框架,也就是说 ...
- omniplan
汉化版安装包 下载链接:https://pan.baidu.com/s/104ZddPtNWTHyEMZx90agKw 密码:qizl 序列号 Name: Appked Serial: I ...
- ReentrantLock源码探究1:非公平锁的获取和释放
1.AQS简单介绍 Sync是ReentrantLock的一个内部类,它继承了AbstractQueuedSynchronizer,即AQS,在CountDownLatch.FutureTask. ...