P4667&&ybtoj【基础算法】5章5题【Switch the Lamp On】
发布日期:2021-06-29 04:50:28
浏览次数:2
分类:技术文章
本文共 2168 字,大约阅读时间需要 7 分钟。
Switch the Lamp On
题目
解析
显然,这一道题中,每个元件都可以旋转,因此本题等价于一道01BFS,只需使用deque即可
01BFS: 在边权只有0/1的情况下,我们可以使用01BFS在 O ( n + m ) O(n+m) O(n+m)的时间内解决 当边权为0时,我们把它塞入队头 反之塞入队尾,即可维护两段性和单调性 ybtoj带多测code(洛谷):
#include#include #include #include #define int long long#define mp make_pair using namespace std;int n,m,ans[510][510],dx[4]={ -1,1,1,-1},dy[4]={ 1,1,-1,-1},tot=0,tx,ty,sx,sy;inline bool check(int x,int y){ return 0<=x&&x<=n&&0<=y&&y<=m;}char c[510][510];pair o2;deque > a;bool ed[510][510][4],u[510][510];signed main(){ memset(ans,0x7f,sizeof(ans)); scanf("%lld%lld",&n,&m),ans[0][0]=0; if((m-n)&1){ printf("NO SOLUTION");return 0;} for(int i=0;i<=n;++i)for(int j=0;j<=m;++j)for(int k=0;k<=3;++k)ed[i][j][k]=1; for(int i=0;i >c[i][j]; if(c[i][j]=='/')ed[i+1][j][0]=ed[i][j+1][2]=0; else ed[i][j][1]=ed[i+1][j+1][3]=0; } a.push_back(mp(0,0)); while(a.size()) { sx=a.front().first,sy=a.front().second,u[sx][sy]=1,a.pop_front(); for(int i=0;i<=3;++i) { tx=sx+dx[i],ty=sy+dy[i]; if(check(tx,ty)&&(!u[tx][ty])) { if(!ed[sx][sy][i]){ if(ans[sx][sy]
code(ybtoj):
#include#include #include #include #define int long long#define mp make_pair using namespace std;inline int abs(int x){ return x>0?x:-x;}int n,m,ans[510][510],dx[4]={ -1,1,1,-1},dy[4]={ 1,1,-1,-1},tot=0,tx,ty,sx,sy,T;inline bool check(int x,int y){ return 0<=x&&x<=n&&0<=y&&y<=m;}char c[510][510];pair o2;deque > a;bool ed[510][510][4],u[510][510];signed main(){ scanf("%lld",&T); while(T--) { scanf("%lld%lld",&n,&m); memset(ans,0x7f,sizeof(ans)); memset(u,0,sizeof(u)); ans[0][0]=0; for(int i=0;i<=n;++i)for(int j=0;j<=m;++j)for(int k=0;k<=3;++k)ed[i][j][k]=1; for(int i=0;i >c[i][j]; if(c[i][j]=='/')ed[i+1][j][0]=ed[i][j+1][2]=0; else ed[i][j][1]=ed[i+1][j+1][3]=0; } if(abs(m-n)&1){ printf("NO SOLUTION\n");continue;} a.push_back(mp(0,0)); while(a.size()) { sx=a.front().first,sy=a.front().second,u[sx][sy]=1,a.pop_front(); for(int i=0;i<=3;++i) { tx=sx+dx[i],ty=sy+dy[i]; if(check(tx,ty)&&(!u[tx][ty])) { if(!ed[sx][sy][i]){ if(ans[sx][sy]
转载地址:https://blog.csdn.net/zhanglili1597895/article/details/118050238 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月21日 20时46分17秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
go 闭包
2019-04-29
go 捕获处理error
2019-04-29
Input dispatching timed out 导致anr问题分析
2019-04-29
主线程中Thread.Sleep()是否会导致ANR
2019-04-29
Android 为什么主线程的looper 一直循环不会ANR
2019-04-29
Android View 的绘制流程
2019-04-29
ContentProvider和数据库的区别
2019-04-29
Android四大组件——ContentProvider的增删改查和优化
2019-04-29
华为入局 VR 眼镜能让 VR 早普及几年?|CSDN博文精选
2019-04-29
做好以下四点,拒做 “ 空心 ” 程序员 | CSDN 博文精选
2019-04-29
程序员为什么非得参加一场编程竞赛?
2019-04-29
V 语言强势登顶 GitHub TOP1,欲取 Go 而代之?
2019-04-29
关于RocketMQ消息拉取与重平衡的一些问题探讨
2019-04-29
不同业务场景下如何进行数据库水平切分?
2019-04-29
如何准备算法工程师面试,斩获一线互联网公司机器学习岗offer?
2019-04-29
循环、递归与魔术(一)——递归与循环的数理逻辑
2019-04-29
1030MD
2019-04-29
发布文章---状态--恢复
2019-04-29
保存测试
2019-04-29