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.首先将根 ...
随机推荐
- WinMail邮件服务器(客户端)环境搭建与配置
WinMail邮件服务器(客户端)环境搭建与配置 一.在搭建WinMail邮件服务器(客户端)之前必备 (1).在虚拟机上安装两个干净无毒的操作系统 ...
- iOS用同一个工程创建两个不同版本的应用
http://www.cocoachina.com/ios/20150916/13324.html 如果同一个应用, 需要做一个带广告Lite版本, 一个不带广告的Pro版本. 那么问题来了, 该如何 ...
- jq 操作CSS
方式有两种,一种是操作元素className间接控制样式,一种是设置css属性值直接控制样式. jQuery 属性操作方法.jQuery CSS 操作函数 1.addClass() $(selecto ...
- Java练习 SDUT-2733_小鑫の日常系列故事(二)——石头剪子布
小鑫の日常系列故事(二)--石头剪子布 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 小鑫在上幼儿园的时候,喜欢跟小伙 ...
- SDUT-2449_数据结构实验之栈与队列十:走迷宫
数据结构实验之栈与队列十:走迷宫 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 一个由n * m 个格子组成的迷宫,起 ...
- HSV转换
HSV中H为色调(Hue).S为饱和度(Saturation).V为亮度(Value)三个分量构成 RGB和HSV颜色空间中进行图像处理的案例,HSV颜色空间分离图像中每一个像素的值或V分量.这个分量 ...
- iptables 删除规则
iptables -nL --line-number显示每条规则链的编号 iptables -D FORWARD 2删除FORWARD链的第2条规则,编号由上一条得知.如果删除的是nat表中的链,记得 ...
- Getting started with the basics of programming exercises_1
1.编写一个将输入复制到输出的程序,并将其中连续的多个空格用一个空格代替 使用if 结构: #include<stdio.h> #define NONBLANK 'a'; // repal ...
- redis 写入数据 越来越慢 是什么原因
redis并不会因为key的增加而导致写入明显变慢,肯定是其他因素.如果redis开启了持久化,在进行持久化时,性能必然下降,可以使用config命令查看持久化设置了没有.另外考虑是否是内存不足,一般 ...
- 创建JAVASCRIPT对象3种方法
创建JAVASCRIPT对象3种方法 方法一:直接定义并创建对象实例 var obj = new Object(); //创建对象实例 //添加属性obj.num = 5; //添加属性 o ...