一直在纠结怎么样表示找到了人,,,开始时竟灰笨得设两个BOOL。后来参考别人的可以使用二进制位。

另外,此处有一个剪枝就是,就到达该点之后的状态的found(即找到人的状态)在之前已出现过,可以剪去。

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue> using namespace std;
bool flag[105][105][4];
char map[105][105];
int see[105][105];
int n,m,lim,sx,sy; int dir[4][2]={
{0,1},
{0,-1},
{1,0},
{-1,0}
}; struct Status{
int x,y;
int found,cnt;
Status(){
found=0;
}
}; void Init(){
memset(see,0,sizeof(see));
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(map[i][j]=='S'){
sx=i,sy=j;
}
if(map[i][j]=='X') continue;
int ii=i,jj=j;
while(jj>=1&&(map[ii][jj]=='.'||map[ii][jj]=='S')) jj--;
if(jj>=1&&map[ii][jj]=='D') see[i][j]|=1;
if(jj>=1&&map[ii][jj]=='E') see[i][j]|=2;
ii=i,jj=j;
while(jj<=m&&(map[ii][jj]=='.'||map[ii][jj]=='S')) jj++;
if(jj<=m&&map[ii][jj]=='D') see[i][j]|=1;
if(jj<=m&&map[ii][jj]=='E') see[i][j]|=2;
ii=i,jj=j;
while(ii<=n&&(map[ii][jj]=='.'||map[ii][jj]=='S')) ii++;
if(ii<=n&&map[ii][jj]=='D') see[i][j]|=1;
if(ii<=n&&map[ii][jj]=='E') see[i][j]|=2;
ii=i,jj=j;
while(ii>=1&&(map[ii][jj]=='.'||map[ii][jj]=='S')) ii--;
if(ii>=1&&map[ii][jj]=='D') see[i][j]|=1;
if(ii>=1&&map[ii][jj]=='E') see[i][j]|=2;
}
}
} bool ok(int x,int y){
if(x>=1&&x<=n&&y>=1&&y<=m) return true;
return false;
} bool slove(){
memset(flag,false,sizeof(flag));
Status s,t;
s.x=sx,s.y=sy,s.found=see[s.x][s.y],s.cnt=0;
// cout<<s.found<<endl;
queue<Status>que;
que.push(s);
while(!que.empty()){
s=que.front();
que.pop();
if(s.cnt>lim) return false;
else if(s.found==3){ printf("%d\n",s.cnt); return true; }
flag[s.x][s.y][s.found]=true;
for(int i=0;i<4;i++){
t=s;
t.x=s.x+dir[i][0];
t.y=s.y+dir[i][1];
if(map[t.x][t.y]=='D'||map[t.x][t.y]=='E'||map[t.x][t.y]=='X'||!ok(t.x,t.y)) continue;
t.found|=see[t.x][t.y];
if(flag[t.x][t.y][t.found]) continue;
flag[t.x][t.y][t.found]=true;
t.cnt++;
que.push(t);
}
}
return false;
} int main(){
int T,t=0;
scanf("%d",&T);
while(T--){
scanf("%d%d%d",&n,&m,&lim);
for(int i=1;i<=n;i++)
scanf("%s",map[i]+1);
Init();
printf("Case %d:\n",++t);
if(!slove()){
puts("-1");
}
}
return 0;
}

  

HDU 4528的更多相关文章

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

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

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

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

  3. HDU(4528),BFS,2013腾讯编程马拉松初赛第五场(3月25日)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4528 小明系列故事——捉迷藏 Time Limit: 500/200 MS (Java/O ...

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

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

  5. hdu 4528(搜索好题)

    小明系列故事——捉迷藏 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total S ...

  6. [kuangbin带你飞]专题二十 斜率DP

            ID Origin Title   20 / 60 Problem A HDU 3507 Print Article   13 / 19 Problem B HDU 2829 Lawr ...

  7. KUANGBIN带你飞

    KUANGBIN带你飞 全专题整理 https://www.cnblogs.com/slzk/articles/7402292.html 专题一 简单搜索 POJ 1321 棋盘问题    //201 ...

  8. [kuangbin带你飞]专题1-23题目清单总结

    [kuangbin带你飞]专题1-23 专题一 简单搜索 POJ 1321 棋盘问题POJ 2251 Dungeon MasterPOJ 3278 Catch That CowPOJ 3279 Fli ...

  9. ACM--[kuangbin带你飞]--专题1-23

    专题一 简单搜索 POJ 1321 棋盘问题POJ 2251 Dungeon MasterPOJ 3278 Catch That CowPOJ 3279 FliptilePOJ 1426 Find T ...

随机推荐

  1. 用Thymeleaf在前台下拉列表取值

    转自:https://blog.csdn.net/u013600907/article/details/76165748

  2. selenium3 + Python - 处理浏览器弹窗(转载)

    作者:Real_Tino 转载链接:https://blog.csdn.net/real_tino/article/details/59068827 我们在浏览网页时经常会碰到各种花样的弹窗,在做UI ...

  3. unity3D 使用欧拉角控制视野注意点

    变量声明: public PlayerInput p; //表示控制代码用来获得用户是否按下 public float rotateSpeed = 50f; //旋转速度 private GameOb ...

  4. 使用cnblogs发布第一篇文章,HelloWorld

    HelloWorld! 瞅瞅源码的样式,嗯,语法高亮还是可以的,辨识度还是挺高的. <!DOCTYPE html> <html> <head> <meta c ...

  5. Android 清空缓存

    APP开发中常有计算缓存大小和清空缓存的功能,此功能很常见,几乎每个应用都能看到,下面就用代码来实现此功能: 步骤为: 1.获取缓存路径 获取长时间保存的文件,Context.getExternalF ...

  6. Go中的main函数和init函数

    Go里面有两个保留的函数:init函数(能够应用于所有的package)和main函数(只能应用于package main).这两个函数在定义时不能有任何的参数和返回值.虽然一个package里面可以 ...

  7. 国内DNS服务器地址

    114DNS114.114.114.114114.114.115.115 腾讯119.29.29.29 百度180.76.76.76 阿里223.5.5.5223.6.6.6 [THE END]

  8. AI:IPPR的模式生成-学习/训练方式(基本结构)

    前言:        一个完备的模式识别系统,必然包含一个模式识别模型,此外还要附加一个评价模型,以及为了构建识别模型而构建的学习模型,并选择在学习模型中使用的学习方法. 否则  w=w 这样,)那样 ...

  9. VTK:VTK嵌入MFC成功

    VTK作为医学显示库,得到较多使用.作为较为上层的设计,对OpenGL进行了封装,并且有Windows.Linux.安卓等开发版本,可移植性较强. 不过VES暂时没有编译成功. 以下是嵌入MFC-ID ...

  10. (转)基于Metronic的Bootstrap开发框架经验总结(6)--对话框及提示框的处理和优化

    http://www.cnblogs.com/wuhuacong/p/4775282.html 在各种Web开发过程中,对话框和提示框的处理是很常见的一种界面处理技术,用得好,可以给用户很好的页面体验 ...