HDU4528 小明捉迷藏 [搜索-BFS]
一、题意
小明S在迷宫n*m中找大明D和二明E,障碍物X不能走,问你计算是否能在时间t内找到大明和二明
二、分析
2.1与普通的BFS不同,这里可以走回头路,这里应该建立四维的标记数组标记数组,例如vis[1][0][nx][ny]表示已经找到D且没找到E且位置为(nx,ny)的状态,相同状态不可重复进入队列
2.2根据样例二可知D,E的位置不可走,起始点S的位置等价于'.'
2.3为了提高效率可预处理一下标记所有可以‘看到’D和E的点
三、代码
# include <iostream>
# include <cstdio>
# include <queue>
# include <cstring>
using namespace std;
const int maxn=;
int cnt,T,n,m,t,vis[][][maxn][maxn];
int seeE[maxn][maxn],seeD[maxn][maxn];
char map[maxn][maxn];
int Dx,Dy,Ex,Ey,Sx,Sy;
int dx[]={-,,,};
int dy[]={,,,-};
struct Node
{
int tim,x,y,e,d;
Node(){}
Node(int ee,int dd,int tt,int xx,int yy)
{
e=ee;
d=dd;
tim=tt;
x=xx;
y=yy;
}
};
void Init()
{
scanf("%d%d%d",&n,&m,&t);
for(int i=;i<n;i++)
scanf("%s",map[i]);
//for(int i=0;i<n;i++)
// printf("%s\n",map[i]);
memset(vis,,sizeof(vis));
memset(seeD,,sizeof(seeD));
memset(seeE,,sizeof(seeE));
for(int i=;i<n;i++)
for(int j=;j<m;j++)
{
if(map[i][j]=='S')
{
Sx=i;
Sy=j;
}
if(map[i][j]=='D')
{
Dx=i;
Dy=j;
for(int i=Dx+;i<n;i++)
if(map[i][Dy]=='.'||map[i][Dy]=='S')
seeD[i][Dy]=;
else break;
for(int i=Dx-;i>=;i--)
if(map[i][Dy]=='.'||map[i][Dy]=='S')
seeD[i][Dy]=;
else break;
for(int j=Dy+;j<m;j++)
if(map[Dx][j]=='.'||map[Dx][j]=='S')
seeD[Dx][j]=;
else break;
for(int j=Dy-;j>=;j--)
if(map[Dx][j]=='.'||map[Dx][j]=='S')
seeD[Dx][j]=;
else break;
}
if(map[i][j]=='E')
{
Ex=i;
Ey=j;
for(int i=Ex+;i<n;i++)
if(map[i][Ey]=='.'||map[i][Ey]=='S')
seeE[i][Ey]=;
else break;
for(int i=Ex-;i>=;i--)
if(map[i][Ey]=='.'||map[i][Ey]=='S')
seeE[i][Ey]=;
else break;
for(int j=Ey+;j<m;j++)
if(map[Ex][j]=='.'||map[Ex][j]=='S')
seeE[Ex][j]=;
else break;
for(int j=Ey-;j>=;j--)
if(map[Ex][j]=='.'||map[Ex][j]=='S')
seeE[Ex][j]=;
else break;
}
}
}
int Solve()
{
int res=-;
queue<Node> Q;
map[Sx][Sy]='.';
Q.push(Node(seeE[Sx][Sy],seeD[Sx][Sy],,Sx,Sy));
vis[seeE[Sx][Sy]][seeD[Sx][Sy]][Sx][Sy]=;
while(!Q.empty())
{
Node temp=Q.front();
Q.pop();
//printf("%d %d %d %d %d\n",temp.e,temp.d,temp.x,temp.y,temp.tim);
if(temp.tim>t) break;
if(temp.e+temp.d==)
{
res=temp.tim;
break;
}
for(int i=;i<;i++)
{
int nx=temp.x+dx[i];
int ny=temp.y+dy[i];
//printf("%d %d\n",nx,ny);
if(nx>=&&ny>=&&nx<n&&ny<m&&map[nx][ny]=='.')
{
int ne=seeE[nx][ny]?:temp.e;
int nd=seeD[nx][ny]?:temp.d;
//if(nx==3&&ny==3) {printf("test:%d\n",vis[ne][nd][nx][ny]); break;}
if(!vis[ne][nd][nx][ny])
{
vis[ne][nd][nx][ny]=;
Q.push(Node(ne,nd,temp.tim+,nx,ny));
}
}
}
}
return res;
}
int main()
{
scanf("%d",&T);
for(int i=;i<=T;i++)
{
Init();
int ans=Solve();
printf("Case %d:\n%d\n",i,ans);
}
return ;
}
HDU4528 小明捉迷藏 [搜索-BFS]的更多相关文章
- hdu4528 小明系列故事——捉迷藏
Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Submission(s ...
- HDU-4528 小明系列故事——捉迷藏 BFS模拟
题意:链接 分析:每一个D或者是E点往四面延伸,并且赋一个特殊的值,能看到D点的点赋值为1,能看到E点的点赋值为1000,这是因为最多100步,因此最后可以根据除以1000和对1000取模来得出某个状 ...
- hdu4528 小明系列故事——捉迷藏(记录状态的BFS)题解
思路: 一道BFS题,和以前的BFS有点不同,这里的vis数组需要记录每次走时的状态,所以开了3维,只对该状态下的vis修改. 注意坑点:S的位置是可以走的 代码: #include<queue ...
- HDU 4528 BFS 小明系列故事——捉迷藏
原题直通车:HDU 4528 小明系列故事——捉迷藏 分析: 标记时加两种状态就行. 代码: #include<iostream> #include<cstring> #inc ...
- C - 小明系列故事――捉迷藏 HDU - 4528 bfs +状压 旅游-- 最短路+状压
C - 小明系列故事――捉迷藏 HDU - 4528 这个题目看了一下题解,感觉没有很难,应该是可以自己敲出来的,感觉自己好蠢... 这个是一个bfs 用bfs就很好写了,首先可以预处理出大明和二明能 ...
- HDU 4828 小明系列故事——捉迷藏
漂亮妹子点击就送:http://acm.hdu.edu.cn/showproblem.php?pid=4528 Time Limit: 500/200 MS (Java/Others) Memo ...
- nyist oj 19 擅长排列的小明(dfs搜索+STL)
擅长排列的小明 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描写叙述 小明十分聪明.并且十分擅长排列计算.比方给小明一个数字5,他能立马给出1-5按字典序的全排列,假设你想 ...
- P4554 小明的游戏 (洛谷) 双端队列BFS
最近没有更新博客,全是因为英语,英语太难了QWQ 洛谷春令营的作业我也不会(我是弱鸡),随机跳了2个题,难度不高,还是讲讲吧,学学新算法也好(可以拿来水博客) 第一题就是这个小明的游戏 小明最近喜欢玩 ...
- 广度优先搜索 BFS算法
广度优先搜索算法(Breadth-First-Search,BFS),又称作宽度优先搜索.BFS算法是从根节点开始,沿着树的宽度遍历树的节点.如果所有节点均被访问,则算法中止. 算法思想 1.首先将根 ...
随机推荐
- 详解 CALayer 和 UIView 的区别和联系
http://www.cocoachina.com/ios/20150828/13244.html 作者:@武蕴牛x 授权本站转载. 前言 前面发了一篇iOS 面试的文章,在说到 UIView 和 C ...
- MaxCompute SQL 使用正则表达式选列
编辑MaxCompute SQL 时,经常会需要在某个表N个列中指定一些列.若需要指定的列比较少,编写SQL时一个个输入既可.当遇到列多的时候,一个个输入就会非常费劲.本文将介绍如何在编写MaxCom ...
- 2019-3-25-win10-uwp-如何将像素数组转-png-文件
title author date CreateTime categories win10 uwp 如何将像素数组转 png 文件 lindexi 2019-3-25 8:53:1 +0800 201 ...
- jQuery 滑动
jQuery 滑动方法 通过 jQuery,您可以在元素上创建滑动效果. jQuery 拥有以下滑动方法: slideDown() slideUp() slideToggle() jQuery sli ...
- 《C语言深度解剖》学习笔记之符号
第2章 符号 1.注释符号 编译器会将注释剔除,用空格代替原来的注释 y=x /* p; 编译器提示出错的原因:实际上,编译器会把“/*”当作一段注释的开始,直到出现“*/”为止. [规则 2-1]注 ...
- python代码实现树莓派3b+驱动步进电机
python代码实现树莓派3b+驱动步进电机 之前买了个树莓派,刚买回来那会儿热情高涨,折腾了一段时间,然后就放那吃灰了.前几天忽然想起来这个东西了,决定再玩玩儿,于是就从某宝上购买了一套步进电机.驱 ...
- vue element 给指数的div加loading
const loading = this.$loading({ lock: true, text: 'Loading', spinner: 'el-icon-lo ...
- 模板—BSGS
#include<iostream> #include<cstdio> #include<cmath> #include<map> #define LL ...
- uni-app获取当前位置
uniapp获取当前城市: 官方api:uni.getLocation()获取当前的地理位置.速度. 在微信小程序中,当用户离开应用后,此接口无法调用,除非申请后台持续定位权限:当用户点击“显示在聊天 ...
- behavior planning——11 create a cost function speed penalty
A key part of getting transitions to happen when we want them to is the design of reasonable cost ...