原题直通车:HDU 4528 小明系列故事——捉迷藏

分析: 标记时加两种状态就行.

代码:

#include<iostream>
#include<cstring>
#include<queue>
#include<cstdio>
using namespace std; const int maxn=101;
char f[maxn][maxn];
int dx[]={0,0,-1,1};
int dy[]={1,-1,0,0};
bool vis[maxn][maxn][2][2];
int n,m,k,ei,ej,di,dj,si,sj;
struct node{
int x,y,time,p,q;
}rt,ne;
void work(node &rt){
bool u;
if(!rt.p&&rt.x==ei){
int a=min(rt.y,ej), b=max(rt.y,ej);
u=false;
for(int i=a+1;i<b;++i)
if(f[ei][i]!='.') u=true;
if(!u)rt.p=1;
}
if(!rt.p&&rt.y==ej){
int a=min(rt.x,ei), b=max(rt.x,ei);
u=false;
for(int i=a+1;i<b;++i)
if(f[i][ej]!='.') u=true;
if(!u)rt.p=1;
}
if(!rt.q&&rt.x==di){
int a=min(rt.y,dj), b=max(rt.y,dj);
u=false;
for(int i=a+1;i<b;++i)
if(f[di][i]!='.')u=true;
if(!u)rt.q=1;
}
if(!rt.q&&rt.y==dj){
int a=min(rt.x,di), b=max(rt.x,di);
u=false;
for(int i=a+1;i<b;++i)
if(f[i][dj]!='.') u=true;
if(!u)rt.q=1;
}
}
int BFS(){
queue<node>M;
rt.x=si, rt.y=sj, rt.time=0, rt.p=0, rt.q=0;
vis[si][sj][0][0]=true;
M.push(rt);
while(!M.empty()){
rt=M.front(); M.pop();
work(rt);
if(rt.p&&rt.q) return rt.time;
for(int i=0;i<4;++i){
ne=rt; ne.x+=dx[i]; ne.y+=dy[i]; ne.time+=1;
if(ne.x<0||ne.x>=n||ne.y<0||ne.y>=m||ne.time>k||f[ne.x][ne.y]!='.') continue;
if(!vis[ne.x][ne.y][ne.p][ne.q]){
M.push(ne);
vis[ne.x][ne.y][ne.p][ne.q]=true;
}
}
}
return -1;
}
int main(){
int T,i,j,t,u,cas=1; scanf("%d",&T);
while(T--){
scanf("%d%d%d",&n,&m,&k);
for(i=0;i<n;++i){
scanf("%s",f[i]);
for(j=0;j<m;++j){
if(f[i][j]=='S') si=i, sj=j,f[i][j]='.';
if(f[i][j]=='E') ei=i, ej=j;
if(f[i][j]=='D') di=i, dj=j;
for(t=0;t<2;++t)
for(u=0;u<2;++u)
vis[i][j][t][u]=false;
}
}
printf("Case %d:\n%d\n",cas++,BFS());
}
return 0;
}

HDU 4528 BFS 小明系列故事——捉迷藏的更多相关文章

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

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

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

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

  3. hdu4528 小明系列故事——捉迷藏

    Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s ...

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

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

  5. HDU-4528 小明系列故事——捉迷藏 BFS模拟

    题意:链接 分析:每一个D或者是E点往四面延伸,并且赋一个特殊的值,能看到D点的点赋值为1,能看到E点的点赋值为1000,这是因为最多100步,因此最后可以根据除以1000和对1000取模来得出某个状 ...

  6. hdu4528 小明系列故事——捉迷藏(记录状态的BFS)题解

    思路: 一道BFS题,和以前的BFS有点不同,这里的vis数组需要记录每次走时的状态,所以开了3维,只对该状态下的vis修改. 注意坑点:S的位置是可以走的 代码: #include<queue ...

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

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

  8. hdu 4542 小明系列故事——未知剩余系

    小明系列故事——未知剩余系 题意:操作0表示某数有n个约数,操作1为某数有n个非约数:n <= 47777,若是存在小于2^62的数符合,则输出该数,否则若是不存在输出Illegal,若是大于2 ...

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

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

随机推荐

  1. CodeForces 797D Broken BST

    $dfs$,线段树. 通过观察可以发现,某位置要能被找到,和他到根这条路上的每个节点的权值存在密切的联系,且是父节点的左儿子还是右儿子也有联系. 可以从根开始$dfs$,边走边更新线段树,如果遍历左儿 ...

  2. 洛谷P3444 [POI2006]ORK-Ploughing [枚举,贪心]

    题目传送门 ork 格式难调,题面就不放了. 分析: 一道偏难的贪心和枚举题.考试的时候是弃疗了...yyb巨佬已经讲的很详细了,推荐他的博客.这里小蒟蒻就只放代码了. Code: #include& ...

  3. SpringBoot整合Shiro实现基于角色的权限访问控制(RBAC)系统简单设计从零搭建

    SpringBoot整合Shiro实现基于角色的权限访问控制(RBAC)系统简单设计从零搭建 技术栈 : SpringBoot + shiro + jpa + freemark ,因为篇幅原因,这里只 ...

  4. MySQL笔记(二)之数据检索常用关键字

    SELECT 用于数据的选择 语法: SELECT 列 FROM 表; #从表中选择某些列,也可以是*,代表全部列 DISTINCT 当某些列包含重复值的时候,DISTINCT用于过滤掉重复值,使重复 ...

  5. FastReport.Net使用:[7]打印空白行

    方法一:使用子报表的最少数据行属性 1.以前面的[简单报表一]为例,右键“数据区”在右键菜单中选择“Add Child Band”菜单添加子报表. 2.为原报表添加一列[序号],使用系统变量中的行号( ...

  6. [BZOJ4009][HNOI2015]接水果(整体二分)

    [HNOI2015]接水果 时间限制:60s      空间限制:512MB 题目描述 风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果. 由于她已经DT FC 了The b ...

  7. POJ3071 Football 概率DP 简单

    http://poj.org/problem?id=3071 题意:有2^n个队伍,给出每两个队伍之间的胜率,进行每轮淘汰数为队伍数/2的淘汰赛(每次比赛都是相邻两个队伍进行),问哪只队伍成为冠军概率 ...

  8. 【20181024T2】小C的序列【GCD性质+链表】

    题面 [错解] 一眼不可做啊 哎分治? 算不了啊 真的是,打暴力走人 20pts (事实上,还有20pts是随机数据,加个小小的特判就可以) [正解] 首先,从l开始往后gcd最多只有O(log)种取 ...

  9. [ZHOJ1131]Find K Min

    题目大意: 给你一个数列,求其中第K大的数. 思路: 类似于快速排序的思想,每次可以确定出当前的的x在数组中的位置. 然后根据位置选择该往左找还是往右找. #pragma GCC optimize(3 ...

  10. 62.COUNT(递归算法)--数的划分变式题型

    文件名:count.cpp 输入输出文件:count.in.count.out 时空:64M,2s 我们已经知道这样一个定理:任意一个正整数能够分解成最多4个数字的平方和.现在给你一些数字,要你求出它 ...