您的位置:首页 > 其它

HDU 2612 find a way (kuangbin带你飞 专题一:简单搜索)

2015-01-23 16:13 381 查看
题意:有两个人Y和M,约定好了再kfc碰面,问两个人碰面的最短时间是多少..

先对Y能达到的所有地方bfs一边记录最短路程存起来,在对Mbfs一边,然后对于kfc这个地方把两个人的最短时间加起来找最小就好了....

注意:有些kfc可能无法到达..so....要判断一下

#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<queue>
#include<iostream>
using namespace std;
int used[233][233][2];//标记是否经过这个点并且记录是第几个人、时间多少
char map[233][233];
int n,m;
struct node
{
int x,y,t;
};
int d[4][2]={1,0,-1,0,0,1,0,-1};
bool ok(int x,int y,int r)
{
if(x<0||y<0||x>=n||y>=m)
return false;
if(map[x][y]=='#'||used[x][y][r]!=-1)
return false;
return true;
}
void bfs(int x,int y,int r)
{
queue<node> q;
node now,next;
now.x=x,now.y=y,now.t=0;
used[x][y][r]=0;
q.push(now);
while(!q.empty())
{
now=q.front();
q.pop();
for(int i=0;i<4;i++)
{
next.x=now.x+d[i][0];
next.y=now.y+d[i][1];
if(ok(next.x,next.y,r))
{
next.t=now.t+1;
used[next.x][next.y][r]=next.t;
q.push(next);
}
}
}
}
int main()
{
while(cin>>n>>m)
{
for(int i=0;i<n;i++)
scanf("%s",map[i]);
memset(used,-1,sizeof(used));
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(map[i][j]=='Y')
bfs(i,j,0);
else if(map[i][j]=='M')
bfs(i,j,1);
}
}
int mini=100000000;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(map[i][j]=='@')
{
if(mini>used[i][j][0]+used[i][j][1]&&(used[i][j][0]>-1&&used[i][j][1]>-1))//需要判断一下这个kfc能不能走到
mini=used[i][j][0]+used[i][j][1];
}
}
}
cout<<mini*11<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: