您的位置:首页 > 其它

HDU2612 Find a way

2015-08-09 00:06 585 查看
给出一个矩阵,里面有墙(#),有起点M和Y,有KFC(@),求M和Y到某一个@的最短时间(也就是求两个路径的和的最小值)

用两个BFS分别可以求出M和Y到每一个@的最短时间(最短路),然后在所有的@中,找到(M到@+Y到@)的最小值。

#include<cstring>
#include<cstdio>
#include<iostream>
#include<queue>
using namespace std;
const int N = 220,dir[4][2]={1,0,-1,0,0,1,0,-1},MAX=2000000000;
int yvis

, mvis

, n, m,res;
char maze

;
struct Node
{
int y, x;
Node(int yy=0,int xx=0):y(yy),x(xx){}
} t;
void ybfs()
{
memset ( yvis, 0, sizeof ( yvis ) );
queue<Node> q;
for ( int i = 0; i < n; i++ )
for ( int j = 0; j < m; j++ )
if ( maze[i][j] == 'Y' )
{
q.push ( Node ( i, j ) );
i = n;
j = m;
}
while(!q.empty())
{
t=q.front();
q.pop();
for(int i=0;i<4;i++)
{
int ny=t.y+dir[i][0];
int nx=t.x+dir[i][1];
if(ny>=0&&ny<n&&nx>=0&&nx<m&&yvis[ny][nx]==0&&maze[ny][nx]!='#')
{
yvis[ny][nx]=yvis[t.y][t.x]+1;
q.push(Node(ny,nx));
}
}
}
}
void mbfs()
{
res=MAX;
memset ( mvis, 0, sizeof ( mvis ) );
queue<Node> q;
for ( int i = 0; i < n; i++ )
for ( int j = 0; j < m; j++ )
if ( maze[i][j] == 'M' )
{
q.push ( Node ( i, j ) );
i = n;
j = m;
}
while(!q.empty())
{
t=q.front();
q.pop();
for(int i=0;i<4;i++)
{
int ny=t.y+dir[i][0];
int nx=t.x+dir[i][1];
if(ny>=0&&ny<n&&nx>=0&&nx<m&&mvis[ny][nx]==0&&maze[ny][nx]!='#')
{
mvis[ny][nx]=mvis[t.y][t.x]+1;
q.push(Node(ny,nx));
if(maze[ny][nx]=='@')
if(yvis[ny][nx]+mvis[ny][nx]<res)
res=yvis[ny][nx]+mvis[ny][nx];
}
}
}
}
int main()
{
//freopen("in.txt","r",stdin);
while ( scanf ( "%d%d", &n, &m ) !=EOF)
{
getchar();
for ( int i = 0; i < n; i++ )
scanf ( "%s", maze[i] );
ybfs();
mbfs();
printf("%d\n",res*11);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  BFS