一、题意

小明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. zabbix3.4.x添加短信报警

    一.修改zabbix_server.conf #vi /etc/zabbix/zabbix_server.conf 去掉注释: ### Option: AlertScriptsPath # Full ...

  2. KiCad EDA 镜像目录说明

    KiCad EDA 镜像目录说明 stable/ -- 稳定版安装包. testing/ -- 测试安装包. nightly/ -- 每日编译安装包. 5.1 版本的每日编译包,这个文件夹是重点,如果 ...

  3. 2018-11-3-WPF-内部的5个窗口之-MediaContextNotificationWindow

    title author date CreateTime categories WPF 内部的5个窗口之 MediaContextNotificationWindow lindexi 2018-11- ...

  4. BZOJ 1008 越狱题解

    其实这题很水,显然n个房间有m种宗教,总共有n^m种情况, 我们再考虑不合法的情况,显然第一个房间有m种情况,而后一种只有m-1种情况(因为不能相同) 所以不合法的情况有(m-1)^(n-1)*m种情 ...

  5. Vue指令:v-for的用法;v-bind绑定class的几种写法;tab标签切换

    一.v-for 的用法 循环指令,可以遍历 Number.String.Object.Array: 循环数字.字符串:有2个参数,分别是value和索引值: 循环对象:有3个参数,分别是 属性值.属性 ...

  6. 【NS2】ns2 otcl与c++关联(转载)

    最近几天,对ns2进行研究,ns2为什么要使用两种语言,因为C++执行速度快,因此对于一些不需要经常改变的东西:例如包的发送.而对于需要经常进行修改的就不能够使用C++,而使用OTcl脚本语言.所有O ...

  7. sql —— having

    在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与聚合函数一起使用.HAVING 子句可以让我们筛选分组后的各组数据. 原表: 我们可以对上面数据根据性别这个字段进行分组查询,分别 ...

  8. 关于使用JavaMail发送邮件

    import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import javax.activati ...

  9. part12.5-定时器去抖

  10. @atcoder - AGC036F@ Square Constraints

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个整数 N,统计有多少个 0~2N-1 的排列 \(P_0 ...