漂亮妹子点击就送:http://acm.hdu.edu.cn/showproblem.php?pid=4528

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

Problem Description
  小明的妈妈生了三个孩子,老大叫大明, 老二叫二明, 老三...,
老三自然就叫小明了。
  一天,小明的妈妈带小明兄弟三人去公园玩耍,公园里面树木很多,有很多地方可以藏身,
于是他们决定玩捉迷藏。经过几轮的猜拳后,第一轮是小明来找其他两个人,游戏规则很简单:
  只要小明可以在规定的时间内找到他们就算小明获胜,并且被发现的两个人猜拳决定谁在下一轮负责找人;如果在规定的时间内只找到一个人,那么没有被发现的人获胜,被找到的人下一轮负责找人;如果在规定的时间内一个人都没有找到,则小明失败了,下一轮还是他来找人。现在小明想知道,在规定时间内,自己是否可以找到所有的人,现在他想请你来帮忙计算一下。
  为了简单起见,把公园看成是n行m列的矩阵,其中’S’表示小明,’D’表示大名,’E’表示二明,’X’表示障碍物,’.’表示通路。这里,我们把发现定义为,可以直接看到对方,
也就是说两个人在同一行或者同一列,并且中间没有障碍物或者没有其他人就可以看到对方。并且假设,大明,二明藏好以后就不会再改变位置,小明每个单位时间可以从当前的位置走到相邻的四个位置之一,并且不会走出公园。
 
Input
测试数据第一行是一个正整数T,表示有T组测试数据。
每一组测试数据首先是三个正整数n,m,t,分别表示行数、列数和规定的时间,接下来n行,每行m个上述的字符,并且保证有且只有一个’S’,一个’E’,一个’D’。

[Technical
Specification]

T < 200
3 <= n, m <= 100
0 <= t <=
100

 
Output
每组先输出一行Case
c:(c表示当前的组数,从1开始计数);
接下来一行,如果小明可以在规定时间内找到所有的人,则输出最少需要的时间,否则输出-1。
 
Sample Input
3
5 6 3
XXD...
....E.
....X.
....S.
......
5 6 3
XDX...
....E.
......
....S.
......
5 6 8
XXDX..
.XEX..
......
....S.
......
 
Sample Output
Case 1:
-1
Case 2:
3
Case 3:
-1
 
 
//一开始竟然想四个方向倍增。。。晕
//因为是在同一行同一列看到对方就可以,所以我们先对大明和二明在四个方向上进行处理,
//标记那些和它同行或同列且之间没有障碍的格子
//表示在这个格子上可一看到大明或者二明,用flag1[][]和flag2[][]来标记
//但是要注意的是,一个格子我们可以走两遍(找完大明再找二明)
//所以,用vis[x][y][2][2]数组表示在(x,y)这个点可以看见的人 //水
//但是我预处理写的也是够233 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std; const int N=; int T,n,m,tim;
int DX,DY,EX,EY,SX,SY;
char map[N][N];
bool flag1[N][N],flag2[N][N],vis[N][N][][];
struct STA
{
int x,y;
int tim;
bool f1,f2;
}now,tmp;
int cx[]={,,,-};
int cy[]={,-,,}; queue<STA> que;
inline int bfs()
{
int x,y,xx,yy;
now.f1=flag1[SX][SY];
now.f2=flag2[SX][SY];
if(now.f1&&now.f2)
return ;
now.tim=;
now.x=SX,now.y=SY;
vis[SX][SY][now.f1][now.f2]=;
while(!que.empty())
que.pop();
que.push(now);
while(!que.empty())
{
now=que.front(),que.pop();
if(now.tim>=tim)
break;
x=now.x,y=now.y;
for(int i=;i<;++i)
{
xx=x+cx[i],yy=y+cy[i];
if(xx<||xx>n||yy<||yy>m||map[xx][yy]!='.')
continue;
tmp.x=xx,tmp.y=yy,tmp.tim=now.tim+;
tmp.f1=now.f1||flag1[xx][yy];
tmp.f2=now.f2||flag2[xx][yy];
if(tmp.f1&&tmp.f2)
return tmp.tim;
if(vis[xx][yy][tmp.f1][tmp.f2])
continue;
vis[xx][yy][tmp.f1][tmp.f2]=;
que.push(tmp);
}
}
return -;
} inline void init() //预处理可以看见的位置
{
flag1[DX][DY]=;
flag2[EX][EY]=;
for(int i=DX+;i<=n;++i)
{
if(map[i][DY]=='S')
{
flag1[i][DY]=;
break;
}
if(map[i][DY]!='.')
break;
flag1[i][DY]=;
}
for(int i=DX-;i;--i)
{
if(map[i][DY]=='S')
{
flag1[i][DY]=;
break;
}
if(map[i][DY]!='.')
break;
flag1[i][DY]=;
}
for(int i=DY+;i<=m;++i)
{
if(map[DX][i]=='S')
{
flag1[DX][i]=;
break;
}
if(map[DX][i]!='.')
break;
flag1[DX][i]=;
}
for(int i=DY-;i;--i)
{
if(map[DX][i]=='S')
{
flag1[DX][i]=;
break;
}
if(map[DX][i]!='.')
break;
flag1[DX][i]=;
}
for(int i=EX+;i<=n;++i)
{
if(map[i][EY]=='S')
{
flag2[i][EY]=;
break;
}
if(map[i][EY]!='.')
break;
flag2[i][EY]=;
}
for(int i=EX-;i;--i)
{
if(map[i][EY]=='S')
{
flag2[i][EY]=;
break;
}
if(map[i][EY]!='.')
break;
flag2[i][EY]=;
}
for(int i=EY+;i<=m;++i)
{
if(map[EX][i]=='S')
{
flag2[EX][i]=;
break;
}
if(map[EX][i]!='.')
break;
flag2[EX][i]=;
}
for(int i=EY-;i;--i)
{
if(map[EX][i]=='S')
{
flag2[EX][i]=;
break;
}
if(map[EX][i]!='.')
break;
flag2[EX][i]=;
}
} int main()
{
scanf("%d",&T);
for(int k=;k<=T;++k)
{
memset(flag1,,sizeof(flag1));
memset(flag2,,sizeof(flag2));
memset(vis,,sizeof(vis));
scanf("%d%d%d",&n,&m,&tim);
for(int i=;i<=n;++i)
{
scanf("%s",map[i]+);
for(int j=;j<=m;++j)
{
if(map[i][j]=='D')
DX=i,DY=j;
else if(map[i][j]=='E')
EX=i,EY=j;
else if(map[i][j]=='S')
SX=i,SY=j;
}
}
init();
printf("Case %d:\n%d\n",k,bfs());
}
return ;
}
/*
1 2 2 2
D.
SE
*/

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. hdu 4542 小明系列故事——未知剩余系 反素数 + 打表

    小明系列故事——未知剩余系 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Prob ...

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

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

随机推荐

  1. java什么是构造方法

    构造方法 一.构造方法的特点 (1)每当创建给定类的实例时就调用的方法 (2)与类同名,但没有返回类型 (3)Java 为对象分配内存,初始化实例变量并调用构造方法 (4)两种构造方法 1.参数化构造 ...

  2. ASP.NET Core应用程序的参数配置及使用(转载)

    本文结构 提前准备 参数配置方式 appsettings.json 环境变量 命令行参数 在控制器中使用配置参数 注入IConfiguration对象 注入IOptions对象 总结 应用程序的开发不 ...

  3. C#文件操作之把字符串取到文本文件及把文本文件读取到字符串中

    一.把字符串读取到文本文件中 using (FileStream fs = new FileStream(Path, FileMode.OpenOrCreate))//把json读到一个文本中 { S ...

  4. nc 从服务器上传下载文件

    1.安装 nc # yum install nc -y 2.下载文件 // 在 45.77.17.128 这台主机监听 9988 端口(注意符号是 "<" ) # nc -l ...

  5. springboot 全局异常捕获,异常流处理业务逻辑

    前言 上一篇文章说到,参数校验,往往需要和全局的异常拦截器来配套使用,使得返回的数据结构永远是保持一致的.参数异常springboot默认的返回结构: { "timestamp": ...

  6. java字符串常用方法总结(更新中..)

    一.String类 1.字符串拼接 String str1 = "abcd"; String str2 = "efgh"; System.out.println ...

  7. C# 查看系统进程

    //使用前需要引用 using System.Diagnostics; var processList = Process.GetProcesses().ToList();

  8. Map接口---Day20

    Map接口概述: 现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等, 这种一一对应的关系,就叫做映射.Java提供了专门的集合类用来存放这种对象关系 ...

  9. 【转载】C#通过Rows.Count属性获取总行数

    在C#中的Datatable数据变量的操作过程中,有时候我们需要知道DataTable中是否含有数据行或者DataTable的数据总行数,此时我们就可以先拿到DataTable中的Rows属性对象,通 ...

  10. Beego 学习笔记一:环境的配置

    Beego 环境的配置 1>     下载go,并安装.下载地址是: https://golang.org/dl/.最好选择这部分的最新的下载安装 2>     配置环境变量(若是没有配置 ...