您的位置:首页 > 其它

hrbust 哈理工oj 1989 营救小组【BFS】

2016-03-15 14:08 337 查看
营救小组

Time Limit: 1000 MS Memory Limit: 32768 K

Total Submit: 181(39 users) Total Accepted: 46(35 users)
Rating: Special Judge: No

Description

    阿尔法营救小队是非常著名的,一天他们接到了一个求助电话,救援小队将目标锁定在一个有限大小的区域中并试图展开救援。救援小队必须在黄金时间里营救出目标,已知这个区域是一个m x n的一个矩形区域(0<m,n<=1000),区域中的S表示求助者的位置,W表示一个救援队员的位置,N表示不可通行的区域,L表示此处可以通行。已知每经过一个点需要消耗一个单位的时间,注意救援小组的人不止有一个,他们可以分布在不同的地方而且只能向上下左右四个方向移动。现在需要知道小队是否能成功的营救出目标呢?(尽管我们都不希望悲剧的发生)

Input

    本题有多组测试数据,对于每组数据的第一行有三个整数m、n和t,分别限制了区域的大小和营救的黄金时间,接下来输入一个m行n列的字符矩阵,这个矩阵反应当时的情况(保证输入数据合法)。输入处理到文件结束。

Output

    如果救援小组能够成功的营救出求助者输出“YES”并换行(不包括引号),否则输出“NO”并换行(不包括引号),只要救援小队能在不超过黄金时间内到达求助者的位置就算是能够成功营救出求助者。

Sample Input

8 6 4

LLWLLL

LNLNWL

LWLNNL

LNLLLL

NLNSNL

NLLNLW

LWNLLN

NNNNNN

Sample Output

YES
Author

我们只需要将所有的W入队列,然后控制好时间限制,直接BFS即可 ,每找到一个S【需要救援的人】,计数器加1,然后统计所有的S一共有多少个,如果最终能救下来的人数等于一共需要救援的人数,那么我们就输出YES,否则输出NO。

AC代码:

#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
struct zuobiao
{
int x;int y;int step;
}now,nex;
int cont;
int cont2;
char a[1005][1005];//图
int vis[1005][1005];//避免走重复会TLE
int fx[4]={0,1,-1,0};//走法
int fy[4]={1,0,0,-1};
queue<zuobiao >s;
int n,m,t;
void bfs()
{
while(!s.empty())
{
now=s.front();
if(a[now.x][now.y]=='S')//如果走到了S,那么就救下来了一个人
{
cont2++;
}
s.pop();
for(int i=0;i<4;i++)
{
nex.x=now.x+fx[i];
nex.y=now.y+fy[i];
if(nex.x>=0&&nex.x<n&&nex.y>=0&&nex.y<m&&vis[nex.x][nex.y]==0&&a[nex.x][nex.y]!='N')
{
nex.step=now.step+1;
if(nex.step<=t)//需要控制在限制时间内
{
s.push(nex);
vis[nex.x][nex.y]=1;
}
}
}
}
}
int main()
{
while(~scanf("%d%d%d",&n,&m,&t))
{
while(!s.empty())
s.pop();
memset(vis,0,sizeof(vis));
cont=0;
cont2=0;
for(int i=0;i<n;i++)
{
scanf("%s",a[i]);
for(int j=0;j<m;j++)
{
if(a[i][j]=='W')//每一个营救小组的人都需要去营救
{
now.x=i;
now.y=j;
now.step=0;
s.push(now);
vis[i][j]=1;
}
if(a[i][j]=='S')//统计一共有多少需要救的人
{
cont++;
}
}
}
bfs();
if(cont==cont2)//如果可以,输出YES
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息