HDU(4528),BFS,2013腾讯编程马拉松初赛第五场(3月25日)
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4528
小明系列故事——捉迷藏
Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 1464 Accepted Submission(s): 423
一天,小明的妈妈带小明兄弟三人去公园玩耍,公园里面树木很多,有很多地方可以藏身, 于是他们决定玩捉迷藏。经过几轮的猜拳后,第一轮是小明来找其他两个人,游戏规则很简单:
只要小明可以在规定的时间内找到他们就算小明获胜,并且被发现的两个人猜拳决定谁在下一轮负责找人;如果在规定的时间内只找到一个人,那么没有被发现的
人获胜,被找到的人下一轮负责找人;如果在规定的时间内一个人都没有找到,则小明失败了,下一轮还是他来找人。现在小明想知道,在规定时间内,自己是否可
以找到所有的人,现在他想请你来帮忙计算一下。
为了简单起见,把公园看成是n行m列的矩阵,其中’S’表示小明,’D’表示大名,’E’表示
二明,’X’表示障碍物,’.’表示通路。这里,我们把发现定义为,可以直接看到对方,
也就是说两个人在同一行或者同一列,并且中间没有障碍物或者没有其他人就可以看到对方。并且假设,大明,二明藏好以后就不会再改变位置,小明每个单位时间
可以从当前的位置走到相邻的四个位置之一,并且不会走出公园。
每一组测试数据首先是三个正整数n,m,t,分别表示行数、列数和规定的时间,接下来n行,每行m个上述的字符,并且保证有且只有一个’S’,一个’E’,一个’D’。
[Technical Specification]
T < 200
3 <= n, m <= 100
0 <= t <= 100
接下来一行,如果小明可以在规定时间内找到所有的人,则输出最少需要的时间,否则输出-1。
5 6 3
XXD...
....E.
....X.
....S.
......
5 6 3
XDX...
....E.
......
....S.
......
5 6 8
XXDX..
.XEX..
......
....S.
......
-1
Case 2:
3
Case 3:
-1
第一次做这种BFS,学了一些东西。主要是参考了syhjh的思路和方法。
总结一下吧:
和普通的宽搜不相同的地方,1,两个目标,2,有步数限制(其实就是个优化咯)
怎么写呢? 结构体中不仅有x,y坐标,time步数,还要有这连个目标是否找到,一个一个的找,宽搜的时候把前一个状态复制过来,结束宽搜的语句就很好写了。然后就是判环(就是不走重复路,mark数组可以4维也可以二维),
然后还有一点很重要,就是样例中的第三个样例,说明了小明不能穿过D,E,所以在初始化的时候就记录下这两个点,然后变为不可走的点。
最后做一下BFS
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
#define MAXN 111
#define inf 1<<30
struct Node
{
int x,y;
int time;
bool tag1,tag2;
};
int n,m,time,ans;
Node st,ed1,ed2;
char maps[MAXN][MAXN];
bool mark[MAXN][MAXN][][];
int dir[][]= {{-,},{,},{,-},{,}}; bool Judge(Node &p)
{
int x=p.x,y=p.y;
if(x==ed1.x)
{
for(int i=y+; i<=m; i++)
{
if(ed1.y==i)
{
p.tag1=true;
break;
}
else if(maps[x][i]=='X')break;
}
for(int i=y-; i>=; i--)
{
if(ed1.y==i)
{
p.tag1=true;
break;
}
else if(maps[x][i]=='X')break;
}
}
if(x==ed2.x)
{
for(int i=y+; i<=m; i++)
{
if(ed2.y==i)
{
p.tag2=true;
break;
}
else if(maps[x][i]=='X')break;
}
for(int i=y-; i>=; i--)
{
if(ed2.y==i)
{
p.tag2=true;
break;
}
else if(maps[x][i]=='X')break;
}
}
if(y==ed1.y)
{
for(int i=x+; i<=n; i++)
{
if(ed1.x==i)
{
p.tag1=true;
break;
}
else if(maps[i][y]=='X')break;
}
for(int i=x-; i>=; i--)
{
if(ed1.x==i)
{
p.tag1=true;
break;
}
else if(maps[i][y]=='X')break;
}
}
if(y==ed2.y)
{
for(int i=x+; i<=n; i++)
{
if(ed2.x==i)
{
p.tag2=true;
break;
}
else if(maps[i][y]=='X')break;
}
for(int i=x-; i>=; i--)
{
if(ed2.x==i)
{
p.tag2=true;
break;
}
else if(maps[i][y]=='X')break;
}
}
if(p.tag1&&p.tag2)return true;
return false;
} void bfs()
{
memset(mark,false,sizeof(mark));
queue<Node>Q;
Node p,q;
mark[st.x][st.y][st.tag1][st.tag2]=true;
Q.push(st);
while(!Q.empty())
{
p=Q.front();
Q.pop();
if(Judge(p))ans=min(ans,p.time);
if(p.time>time)continue; ///you hua
for(int i=; i<; i++)
{
q=p;
q.x=p.x+dir[i][];
q.y=p.y+dir[i][];
if(q.x<||q.x>n||q.y<||q.y>m||maps[q.x][q.y]=='X')
continue;
if(!mark[q.x][q.y][q.tag1][q.tag2])
{
mark[q.x][q.y][q.tag1][q.tag2]=true;
q.time++;
Q.push(q);
}
}
}
} int main()
{
int _case,t=;
scanf("%d",&_case);
while(_case--)
{
scanf("%d%d%d",&n,&m,&time);
for(int i=; i<=n; i++)
{
scanf("%s",maps[i]+);
for(int j=; j<=m; j++)
{
if(maps[i][j]=='S')
{
st.x=i,st.y=j,st.tag1=st.tag2=false,st.time=;
}
else if(maps[i][j]=='E')
{
ed1.x=i,ed1.y=j;
maps[i][j]='X';
}
else if(maps[i][j]=='D')
{
maps[i][j]='X';
ed2.x=i,ed2.y=j;
}
}
}
ans=inf;
bfs();
printf("Case %d:\n",t++);
if(ans<=time)
{
printf("%d\n",ans);
}
else
puts("-1");
}
return ;
}
HDU(4528),BFS,2013腾讯编程马拉松初赛第五场(3月25日)的更多相关文章
- 2013腾讯编程马拉松初赛第〇场(HDU 4504)威威猫系列故事——篮球梦
http://acm.hdu.edu.cn/showproblem.php?pid=4504 题目大意: 篮球赛假如我们现在已经知道当前比分 A:B,A代表我方的比分,B代表对方的比分,现在比赛还剩下 ...
- 2013腾讯编程马拉松初赛第〇场(HDU 4503) 湫湫系列故事——植树节
http://acm.hdu.edu.cn/showproblem.php?pid=4503 题目: 已知湫湫的班里共有n个孩子,每个孩子有Bi个朋友(i从1到n),且朋友关系是相互的,如果a小朋友和 ...
- 2013腾讯编程马拉松初赛第〇场(3月20日)湫湫系列故事——植树节 HDOJ 4503
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4503 思路:hint from a GOD-COW. 将每一个人模拟成图的一个点,两点连线当且仅当两人是朋 ...
- HDU 4508 湫湫系列故事——减肥记I (2013腾讯编程马拉松初赛第一场)
http://acm.hdu.edu.cn/showproblem.php?pid=4508 题目大意: 给定一些数据. 每组数据以一个整数n开始,表示每天的食物清单有n种食物. 接下来n行,每行两 ...
- 2013腾讯编程马拉松初赛第二场(3月22日) 小Q系列故事——为什么时光不能倒流 ---好水!!
我以为我会是最坚强的那一个 我还是高估了自己 我以为你会是最无情的那一个 还是我贬低了自己 就算不能够在一起 我还是为你担心 就算你可能听不清 也代表我的心意 那北极星的眼泪 闪过你曾经的眼角迷离 那 ...
- 2013腾讯编程马拉松初赛第一场(3月21日) 湫湫系列故事——减肥记II ----线段树
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4509 虽然制定了减肥食谱,但是湫湫显然克制不住吃货的本能,根本没有按照食谱行动! 于是,结果显而易见… 但 ...
- HDU 4508 沼泽湿地系列故事——记住减肥I (2013腾讯编程马拉松预赛第一)
pid=4508">http://acm.hdu.edu.cn/showproblem.php?pid=4508 题目大意: 给定一些数据. 每组数据以一个整数n開始,表示每天的食物清 ...
- 2013腾讯编程马拉松||HDU 4505 小Q系列故事——电梯里的爱情 水水水
http://acm.hdu.edu.cn/showproblem.php?pid=4505 题目大意: 电梯最开始在0层,并且最后必须再回到0层才算一趟任务结束.假设在开始的时候已知电梯内的每个人要 ...
- HDOJ 4509 湫湫系列故事——减肥记II(2013腾讯编程马拉松) 并查集合并区间
发现这种合并区间的题目还可以这么玩 给你n段时间 然后问没被占用的时间是多少 题目所给的区间是右开的导致我wa 好多人5e5*1440的暴力跑出来的时间居然只是我的两倍 不懂.... 所以并查集并没有 ...
随机推荐
- iOS 延迟执行
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(<#delayInSeconds#> * NSEC_PER_SEC)), ...
- C++Builder 笔记
1.界面窗口如何不显示标题栏? 在Form属性栏里面把BorderStyle的值设为None 2.wchar_t wchar_t是C/C++的字符类型,是一种扩展的存储方式,wchar_t类型主要用在 ...
- HDU 4888 Redraw Beautiful Drawings(最大流+判最大流网络是否唯一)
Problem Description Alice and Bob are playing together. Alice is crazy about art and she has visited ...
- Codeforces Beta Round #93 (Div. 1 Only) D. Fibonacci Sums
先考虑一个斐波那契数能分成其他斐波那契数的方案,假如f[i]表示第i个斐波那契数,那么只要对他进行拆分,f[i-1]这个数字必定会存在.知道这一点就可以进行递推了.先将数字分成最少项的斐波那契数之和, ...
- ajax基本用法
ajax能做到无刷新数据交互,给用户体验带来好处的同时也减小了服务器的压力,所以运用ajax能使网站性能更强劲.更吸引用户. 大型网站少不了注册页面,而大多数情况下我们不想让用户有相同的注册ID,所以 ...
- 10---Net基础加强
复习: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Syst ...
- 夺命雷公狗—angularjs—15—内置封装好的计时器$interval和$timeout
这里其实和js源生的效果是一样的,但是源生的在angularjs里面不能直接正常执行代码如下所示: <!DOCTYPE html> <html lang="en" ...
- 夺命雷公狗—angularjs—10—angularjs里面的内置函数
我们没学一门语言或者框架,几乎里面都有各自的语法和内置函数,当然,强悍的angularjs也不例外,他的方法其实常用的没多少,因为很多都可以用源生jis几乎都能完成一大部分.. <!doctyp ...
- python—类对象和实例对象的区别
最近在对RF的通讯层的模块进行封装,需要将之前放在类似main里面的一个方法,如下所示:这段代码是开发提供,用于接口测试,模拟底层通讯,具体的通讯是在dll内,python这边只是做了个封装让RF进行 ...
- JS中数组的操作
1.数组的创建 var arrayObj = new Array(); //创建一个数组 var arrayObj = new Array([size]); //创建一个数组并指定长度,注意不是上限, ...