一直在纠结怎么样表示找到了人,,,开始时竟灰笨得设两个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. mtools 是由MongoDB 官方工程师实现的一套工具集,可以很快速的日志查询分析、统计功能,此外还支持本地集群部署管理.

    mtools 是由MongoDB 官方工程师实现的一套工具集,可以很快速的日志查询分析.统计功能,此外还支持本地集群部署管理 https://www.cnblogs.com/littleatp/p/9 ...

  2. Oracle 12.2.0.1 RAC for rhel 7.X 数据库安装(节点1执行root.sh失败)

    说明: 最开始是用的rehat7.2安装12.2.0.1,后面安装GI节点一执行root.sh脚本失败,排查原因,最开始以为是操作系统的问题,换成rehat7.6,同样的出现问题,经过一番折腾,后面通 ...

  3. epoll实现reactor模式

  4. dotnet core 发布配置(测试数据库和正式数据库自动切换)

    一.起源 在进行项目开发时,常常要求开发环境,测试环境及正式环境的分离,并且不同环境运行的参数都是不一样的,比如监听地址,数据库连接信息等.当然我们把配置信息保存到一个文件中,每次发布的时候,可以先修 ...

  5. react中withRouter解决props返回为空

    利用 react + antd 框架书写导航栏时,遇到了几个坑,分别是一级菜单和二级菜单在点击的情况下,高亮没有任何问题,但是再点击浏览器返回按钮时,却就乱套了. 1. 二级菜单中,我们可以通过 pr ...

  6. Android RxVolley = Volley + RxJava + OkHttp

    Github:https://github.com/kymjs/RxVolley RxVolley使用文档 V1.0:http://rxvolley.mydoc.io/ 一.RxVolley使用指南 ...

  7. ionic Plugin插件,与原生app端交互,ionic端代码

    创建plugins 目录 definitions.ts文件 definitions.ts文件: import {Plugin} from '@capacitor/core/dist/esm/defin ...

  8. 构造函数+原型的js混合模式

    function Parent(){ this.name = "李小龙"; this.age = "30"; };Parent.prototype.lev=fu ...

  9. day36 类的三大特性---封装以及Property特性

    目录 类的封装 如果真的要拿 类的property特性 setter & deleter 类属性用法 类与对象的绑定方法和非绑定方法 对象方法&类方法&静态方法 隐藏模块内的函 ...

  10. PAT_A1078#Hashing

    Source: PAT A1078 Hashing (25 分) Description: The task of this problem is simple: insert a sequence ...