HDU 2612 Find a way

这是一个双向搜索题,我用BFS把所有的点都搜索到;再进行两次搜索的比较;

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
class Node
{
public:
int x , y ;
int step;
int num;
};
Node queue[80024];
int step[2][204][204],N,M;
int d[4][2] = { 0,1,1,0,-1,0,0,-1 };
char map[204][204];
int BFS( int x1,int y1, int x2 ,int y2 )
{
int min = 0X7fffffff;
int first = 0 , end = 0;
Node t ;
t.x = x1; t.y = y1;
t.step = 0 , t.num = 0;
queue[end] = t;
end++;
t.x = x2; t.y = y2;
t.step = 0 , t.num = 1;
queue[end] =t;
end++;
step[0][x1][y1] = 0;
step[1][x2][y2] = 0;
while( first < end )
{
t = queue[ first ];
for( int i = 0; i < 4 ; i++ )
{
int dx = d[i][0] + t.x;
int dy = d[i][1] + t.y;
if( step[t.num][dx][dy]==-1 )
{
if( map[dx][dy] !='#'&&map[dx][dy] != 0)
{
step[t.num][dx][dy] = t.step + 1;
queue[end].x = dx;
queue[end].y = dy;
queue[end].num = t.num;
queue[end].step = t.step + 1;
end++;
}
}
}
first++;
}
for( int i = 1 ; i <= N ; i++)
for( int j = 1 ; j<=M ; j++ )
{
if( map[i][j]=='@'&&step[0][i][j]!=-1&&step[1][i][j]!=-1 )//判断该点是否合法
{
if( step[0][i][j]+step[1][i][j]<min )
min = step[0][i][j]+step[1][i][j];
// printf( "%d %d\n",step[0][i][j],step[1][i][j] );
}
}
return min*11;
}
int main( )
{
int x1,y1,x2,y2;
while( scanf( "%d%d",&N, &M )==2 )
{
memset( map , 0 ,sizeof( map ) );
memset( step , -1 ,sizeof( step ) );
for( int i = 1 ; i<= N ; i++ )
{
scanf( "%s", map[i]+1 );
for( int j = 1 ; j<=M ; j++ )
{
if( map[i][j]=='M' )
{
x1 = i;
y1 = j;
}
else if( map[i][j]=='Y' )
{
x2 = i;
y2 = j;
}
}
}
printf( "%d\n",BFS( x1, y1 ,x2 ,y2 ) );
}
return 0;
}

 

posted @ 2012-03-02 14:51  wutaoKeen  阅读(181)  评论(0编辑  收藏  举报