一直在纠结怎么样表示找到了人,,,开始时竟灰笨得设两个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. 洛谷P3834 可持久化线段树(主席树)模板

    题目:https://www.luogu.org/problemnew/show/P3834 无法忍受了,我要写主席树! 解决区间第 k 大查询问题,可以用主席树,像前缀和一样建立 n 棵前缀区间的权 ...

  2. multimap的使用 in C++,同一个关键码存在多个值

    #include <iostream> #include <string> #include <vector> #include <algorithm> ...

  3. k-means 聚类前的数据分析

    原始数据 Say you are given a data set where each observed example has a set of features, but has nolabel ...

  4. sdut1269 走迷宫(dfs)

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1269 连着做了三个基本的dfs,终于弄懂了搜索 ...

  5. [BZOJ2321,LuoguP1861]星(之)器

    丧心病狂的神仙题 丧心病狂的神仙题 丧心病狂的神仙题 显然,不管你怎么移动,答案都是一定的 然后我们很快能联系到物理里面的能量守恒,于是自然地我们要给每个点搞一个势能出来 然后把势能的表达式写出来就可 ...

  6. mysql Workbench新建数据库连接时提示SSl not enabled的问题

    在使用workbench时会弹出以下的对话框,不过这不影响使用,点击ok之后对话框关闭,接着直接点击close就行了,之后会显示已经连接上了数据库.具体ssl的方面还没研究,等研究了再贴

  7. 去除安卓apk中的广告

    一般来说,安卓应用很多免费的apk都是有广告的.尽管我们要坚持尊重开发者,帮帮他们点击广告赚钱来可持续发展,但是有的时候,很多游戏中游戏实在是太影响感觉了,当找不到汉化破解版本的时候,也许需要亲自把它 ...

  8. 用Python+selenium打开IE浏览器和Chrome浏览器的问题

    这几天在学Python+selenium自动化,对三大浏览器Firefox,Chrome和IE都做了尝试,也都分别下载了对应的webdriver,如:geckodriver.chromedriver. ...

  9. Memcached 之内存管理与删除机制

    一.内存的碎片化 如果用c语言直接 malloc,free 来向操作系统申请和释放内存时,在不断的申请和释放过程中,形成了一些很小的内存片断,无法再利用,这种空闲,但无法利用内存的现象称为内存的碎片化 ...

  10. H5-data属性的一个问题

    关于前端存数据的问题,前面写过一个博客:前端页面存取数据 看个例子: <!DOCTYPE html> <html lang="en"> <head&g ...