一、题意

小明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]的更多相关文章

  1. hdu4528 小明系列故事——捉迷藏

    Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s ...

  2. HDU-4528 小明系列故事——捉迷藏 BFS模拟

    题意:链接 分析:每一个D或者是E点往四面延伸,并且赋一个特殊的值,能看到D点的点赋值为1,能看到E点的点赋值为1000,这是因为最多100步,因此最后可以根据除以1000和对1000取模来得出某个状 ...

  3. hdu4528 小明系列故事——捉迷藏(记录状态的BFS)题解

    思路: 一道BFS题,和以前的BFS有点不同,这里的vis数组需要记录每次走时的状态,所以开了3维,只对该状态下的vis修改. 注意坑点:S的位置是可以走的 代码: #include<queue ...

  4. HDU 4528 BFS 小明系列故事——捉迷藏

    原题直通车:HDU 4528 小明系列故事——捉迷藏 分析: 标记时加两种状态就行. 代码: #include<iostream> #include<cstring> #inc ...

  5. C - 小明系列故事――捉迷藏 HDU - 4528 bfs +状压 旅游-- 最短路+状压

    C - 小明系列故事――捉迷藏 HDU - 4528 这个题目看了一下题解,感觉没有很难,应该是可以自己敲出来的,感觉自己好蠢... 这个是一个bfs 用bfs就很好写了,首先可以预处理出大明和二明能 ...

  6. HDU 4828 小明系列故事——捉迷藏

    漂亮妹子点击就送:http://acm.hdu.edu.cn/showproblem.php?pid=4528 Time Limit: 500/200 MS (Java/Others)    Memo ...

  7. nyist oj 19 擅长排列的小明(dfs搜索+STL)

    擅长排列的小明 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描写叙述 小明十分聪明.并且十分擅长排列计算.比方给小明一个数字5,他能立马给出1-5按字典序的全排列,假设你想 ...

  8. P4554 小明的游戏 (洛谷) 双端队列BFS

    最近没有更新博客,全是因为英语,英语太难了QWQ 洛谷春令营的作业我也不会(我是弱鸡),随机跳了2个题,难度不高,还是讲讲吧,学学新算法也好(可以拿来水博客) 第一题就是这个小明的游戏 小明最近喜欢玩 ...

  9. 广度优先搜索 BFS算法

    广度优先搜索算法(Breadth-First-Search,BFS),又称作宽度优先搜索.BFS算法是从根节点开始,沿着树的宽度遍历树的节点.如果所有节点均被访问,则算法中止. 算法思想 1.首先将根 ...

随机推荐

  1. 数据人看Feed流-架构实践

    背景 Feed流:可以理解为信息流,解决的是信息生产者与信息消费者之间的信息传递问题.我们常见的Feed流场景有:1 手淘,微淘提供给消费者的首页商品信息,用户关注店铺的新消息等2 微信朋友圈,及时获 ...

  2. Azkaban3.x

    Azkaban3.x安装部署 官方文档地址 三种模式 solo-server模式:exec进程和web进程为同一个进程,存放元数据的数据库为H2 two-server模式:与之前的单机版本类似,exe ...

  3. mysql带有子查询的like查询

    SELECT * FROM by_app_categories WHERE c_name LIKE CONCAT('%', (SELECT `name` FROM b_catelist WHERE t ...

  4. 2019-8-31-PowerShell-拿到最近的10个系统日志

    title author date CreateTime categories PowerShell 拿到最近的10个系统日志 lindexi 2019-08-31 16:55:58 +0800 20 ...

  5. golang micro client 报错500 {"id":"go.micro.client","code":408,"detail":"call timeout: context deadline exceeded","status":"Request Timeout"}

    go micro web端连接services时,第一次访问提示500(broken pipe),排查发现客户端请求services时返回 {"id":"go.micro ...

  6. oracle函数 CHR(n1)

    [功能]:将ASCII 码转换为字符. [参数]:n1,为0 ~ 255,整数 [返回]:字符型 [示例] SQL> select chr(54740) zhao,chr(65) chr65 f ...

  7. Python基础:21包装

    “包装”在Python 编程中经常会被提到的一个术语.意思是对一个已存在的对象进行包装,可以是对一个已存在的对象,增加,删除,或者修改功能. 可以包装任何类型(type)作为一个类(class)的核心 ...

  8. 「BZOJ3505」[CQOI2014] 数三角形

    「BZOJ3505」[CQOI2014] 数三角形 这道题直接求不好做,考虑容斥,首先选出3个点不考虑是否合法的方案数为$C_{(n+1)*(m+1)}^{3}$,然后减去三点一线的个数就好了.显然不 ...

  9. pytorch学习笔记(九):PyTorch结构介绍

    PyTorch结构介绍对PyTorch架构的粗浅理解,不能保证完全正确,但是希望可以从更高层次上对PyTorch上有个整体把握.水平有限,如有错误,欢迎指错,谢谢! 几个重要的类型和数值相关的Tens ...

  10. selenium webdriver学习(三)------------执行js脚本

    selenium webdriver学习(三)------------执行js脚本 博客分类: Selenium-webdriver   在用selenium 1.X的时候常常会用到getEval() ...