
HDU 2102 A计划(BFS+细节维护)
发布日期:2021-05-14 14:38:03
浏览次数:20
分类:精选文章
本文共 2278 字,大约阅读时间需要 7 分钟。
一道很裸的BFS,看时间复杂度看可以用DFS+剪枝就很神奇。
第一次做的时候维护了很多量,比如时间在此题中是一个重要的量,但是不用时刻维护,只需要维护走到当前位置需要多少天,最后找到P是多少天(如果能的话),比较找到P的天数和给定的天数即可。还有一个问题就是图的构建,开始我将N开大两倍,发现这样做有很严重的边界判断问题,容易出现bug还使得代码量增加,直接再开一维能够避免上述情况。此题还有一个教训是hdu上有个误导性样例,除非万不得已不要看discuss,简直有毒。 总之此题走出了很多坑,是到不错的题目,BFS代码量比较多,但是先想清楚怎么样做能使得代码量尽可能小,尽可能简单是写之前需要想的事情,不要一看到就动手,先分析一波。#include#include #include using namespace std;struct node{ int x,y,c; bool d;};queue q;char a[15][15][2];int vis[15][15][2];int dx[4]={ 0,0,1,-1};int dy[4]={ 1,-1,0,0};int n,m,k;int main(){ int t; scanf("%d",&t); while(t--){ scanf("%d%d%d",&n,&m,&k); for(int p=0;p<2;p++){ for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ scanf("\n\n%c",&a[i][j][p]); } } } bool as=0; vis[1][1][0]=1; node ne; ne.x=1;ne.y=1;ne.c=0;ne.d=0; q.push(ne); int cnt; while(!q.empty()){ node z; z=q.front(); q.pop(); if(a[z.x][z.y][z.d]=='P'){ cnt=z.c; as=1; break; } for(int i=0;i<4;i++){ int xx=z.x+dx[i]; int yy=z.y+dy[i]; if(xx>=1&&xx<=n&&yy<=m&&yy>=1&&!vis[xx][yy][z.d]&&a[xx][yy][z.d]!='*'){ if(a[xx][yy][z.d]=='.'||a[xx][yy][z.d]=='P'){ node f; f.x=xx; f.y=yy; f.c=z.c+1; f.d=z.d; vis[xx][yy][z.d]=1; q.push(f); } if(a[xx][yy][z.d]=='#'&&a[xx][yy][!z.d]!='#'&&a[xx][yy][!z.d]!='*'&&!vis[xx][yy][!z.d]){ node f; f.x=xx; f.y=yy; f.c=z.c+1; f.d=!z.d; vis[xx][yy][!z.d]=1; q.push(f); } } } } if(!as||cnt>k)printf("NO\n"); else printf("YES\n"); memset(vis,0,sizeof(vis)); memset(a,0,sizeof(a)); while(!q.empty())q.pop(); }}
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2025年04月17日 09时56分48秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
GitHub上传时,项目在已有文档时直接push出现错误解决方案
2021-05-14
云数据库
2021-05-14
图计算
2021-05-14
大数据在不同领域的应用
2021-05-14
页面置换算法
2021-05-14
推荐系统资料
2021-05-14
文件系统的层次结构
2021-05-14
减少磁盘延迟时间的方法
2021-05-14
vue(渐进式前端框架)
2021-05-14
权值初始化和与损失函数
2021-05-14
案例讨论
2021-05-14
传输层基本功能
2021-05-14
最长公共子序列
2021-05-14
问题的计算复杂度:排序问题
2021-05-14
算法的伪码表示
2021-05-14
递推方程与算法分析
2021-05-14
主定理的应用
2021-05-14
动态规划算法的迭代实现
2021-05-14
最优装载问题
2021-05-14
最大团问题
2021-05-14