思路:

一道BFS题,和以前的BFS有点不同,这里的vis数组需要记录每次走时的状态,所以开了3维,只对该状态下的vis修改。

注意坑点:S的位置是可以走的

代码:

#include<queue>
#include<cstdio>
#define ll long long
using namespace std;
const int N = 100+5;
char mp[N][N];
bool vis[4][N][N];
int X1,Y1,X2,Y2,x,y,n,m,t,to[4][2] = {0,1,0,-1,1,0,-1,0},cnt = 1;
struct node{
int x,y;
int step;
int Find;
};
void update(node &a){
if(a.x == X1 && a.Find != 1){ //等于1不改变状态
int s = min(a.y,Y1) + 1;
int e = max(a.y,Y1) - 1;
int flag = 1;
for(int i = s;i <= e;i++){
if(mp[X1][i] != '.'){
flag = 0;
break;
}
}
if(flag) a.Find = (a.Find == 0? 1 : 3);
}
if(a.x == X2 && a.Find != 2){
int s = min(a.y,Y2) + 1;
int e = max(a.y,Y2) - 1;
int flag = 1;
for(int i = s;i <= e;i++){
if(mp[X2][i] != '.'){
flag = 0;
break;
}
}
if(flag) a.Find = (a.Find == 0? 2 : 3);
}
if(a.y == Y1 && a.Find != 1){
int s = min(a.x,X1) + 1;
int e = max(a.x,X1) - 1;
int flag = 1;
for(int i = s;i <= e;i++){
if(mp[i][Y1] != '.'){
flag = 0;
break;
}
}
if(flag) a.Find = (a.Find == 0? 1 : 3);
}
if(a.y == Y2 && a.Find != 2){
int s = min(a.x,X2) + 1;
int e = max(a.x,X2) - 1;
int flag = 1;
for(int i = s;i <= e;i++){
if(mp[i][Y2] != '.'){
flag = 0;
break;
}
}
if(flag) a.Find = (a.Find == 0? 2 : 3);
}
}
void BFS(){
queue<node> q;
while(!q.empty()) q.pop();
node a,b;
a.x = x,a.y = y,a.Find = 0,a.step = 0;
update(a);
q.push(a);
while(!q.empty()){
a = q.front();q.pop();
if(a.Find == 3 && a.step <= t){
printf("Case %d:\n%d\n",cnt++,a.step);
return;
}
for(int i = 0;i < 4;i++){
b.x = a.x + to[i][0];
b.y = a.y + to[i][1];
if(b.x < 1 || b.y < 1 || b.x > n || b.y > m) continue;
if(mp[b.x][b.y] != '.') continue;
b.Find = a.Find;
update(b);
if(vis[b.Find][b.x][b.y]) continue;
vis[b.Find][b.x][b.y] = true;
b.step = a.step + 1;
q.push(b);
}
}
printf("Case %d:\n-1\n",cnt++);
}
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d%d",&n,&m,&t);
for(int i = 1;i <= n;i++){
scanf("%s",mp[i] + 1);
for(int j = 1;j <= m;j++){
if(mp[i][j] == 'D') X1 = i,Y1 = j;
else if(mp[i][j] == 'E') X2 = i,Y2 = j;
else if(mp[i][j] == 'S') x = i,y = j,mp[i][j] = '.';
}
}
memset(vis,0,sizeof(vis));
BFS();
}
return 0;
}

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. C - 小明系列故事――捉迷藏 HDU - 4528 bfs +状压 旅游-- 最短路+状压

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

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

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

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

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

  6. HDU 4528 小明系列故事――捉迷藏

    广搜. 根据题意,可以知道状态总共有$4*n*m$种.每一个位置四种状态:两个都没有发现:发现$E$没发现$D$:发现$D$没发现$E$:两个都发现. 每次移动的花费都是$1$,队列里面状态的费用是单 ...

  7. HDU 4511 小明系列故事——女友的考验 (AC自动机+DP)

    小明系列故事——女友的考验 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total ...

  8. HDU 4511 小明系列故事——女友的考验 (AC自动机 + DP)

    小明系列故事——女友的考验 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total ...

  9. hdu 4506 小明系列故事——师兄帮帮忙【幂取模乱搞】

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=4506 http://acm.hust.edu.cn/vjudge/contest/view.action ...

随机推荐

  1. linux删除指定行&删除行首空格&替换字符

    打印并删除2~1000行 nl /etc/passwd | sed '2,1000d' |more 删除行首空格 sed -i 's/^[][ ]*//g' file 替换分隔符 说明:文件中数据是由 ...

  2. IO流(8)递归删除带文件的目录

    递归删除带内容的目录 * * 目录给定:demo * * 分析: * A:封装目录 * B:获取该目录下的所有文件或者文件夹的File数组 * C:遍历该File数组,得到每一个File对象 * D: ...

  3. 【JMeter】如何优雅的写脚本

    cc给发的视频链接: http://v.youku.com/v_show/id_XMzA4Mjg1ODA0MA==.html?spm=a2h3j.8428770.3416059.1 ————————— ...

  4. Loadrunner之https协议录制回放报错如何解决?(九)

    一.录制中遇到报错27778的问题(如下图1),即关于录制的链接为https开头的问题,分两个步骤解决,如下: 图1 https访问报错解决步骤如下: 1.修改Vuser-->Run-time ...

  5. LINUX的特殊字符含义

    # 井号 (comments)这几乎是个满场都有的符号,除了先前已经提过的"第一行"#!/bin/bash井号也常出现在一行的开头,或者位于完整指令之后,这类情况表示符号后面的是注 ...

  6. mysql 权限管理 对所有库 所有表 授权 *.*

    对miek这个账号localhost 授予了所有库,所表的select权限 mysql> grant select on *.* to 'mike'@'localhost'; Query OK, ...

  7. js-jquery-数组遍历

    一.原生方法支持 1.普通for循环 for(j = 0; j < arr.length; j++) { } 说明:性能很高,但是仍可以优化. 2.优化版for循环[推荐] for(j = 0, ...

  8. (转)Springboot 中filter 注入对象

    问题:我建立一个全局拦截器,当然,这是测试的时候建立的,我把它命名为LogFilter,它继承了Filter,web应用启动的顺序是:listener->filter->servlet,而 ...

  9. 集成学习ensemble

    集成学习里面在不知道g的情况下边学习边融合有两大派:Bagging和Boosting,每一派都有其代表性算法,这里给出一个大纲. 先来说下Bagging和Boosting之间的相同点:都是不知道g,和 ...

  10. unity3d-碰撞检测

    碰撞检测 游戏中很多时候都要判断碰撞检测,比如子弹打中敌机.当碰撞后.就要发生爆炸. 或者敌机减血, 我们先看一张图片,看皮球从天空下落.与地面碰撞的过程 碰撞检测条件 游戏中两个对象发生碰撞是需要条 ...