hdu 2612 Find a way
两个BFS即可。。
#include"stdio.h"
#include"string.h"
#include"queue"
#define N 205
using namespace std;
char str[N][N];
int n,m,a1[1004]={0},a2[1004]={0};
int sum,k,b1[1004]={0},b2[1004]={0};
int map[N][N];
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
struct node
{
int x,y,step;
};
struct ss
{
int x,y;
}s[1004];
int join(int x,int y)
{
int i;
for(i=1;i<k;i++)
if(s[i].x==x&&s[i].y==y)
return i;
return -1;
}
void bfs1(int x,int y)
{
queue<node>Q;
node q,p;
p.x=x;
p.y=y;
p.step=0;
memset(map,0,sizeof(map));
int t,i;
map[x][y]=0;
Q.push(p);
while(!Q.empty())
{
p=Q.front();
Q.pop();
t=join(p.x,p.y);
if(t)
{
map[p.x][p.y]=1;
a1[t]=p.step;
}
for(i=0;i<4;i++)
{
q=p;
q.x+=dir[i][0];
q.y+=dir[i][1];
q.step+=11;
if(q.x>=0&&q.x<n&&q.y>=0&&q.y<m
&&!map[q.x][q.y]&&str[q.x][q.y]!='#')
{
map[q.x][q.y]=1;
Q.push(q);
}
}
for(i=1;i<k;i++)
{
if(a1[i])b1[i]=a1[i];
else b1[i]=-1;
}
}
}
void bfs2(int x,int y)
{
queue<node>Q;
node q,p;
p.x=x;
p.y=y;
p.step=0;
memset(map,0,sizeof(map));
int t,i;
map[x][y]=0;
Q.push(p);
while(!Q.empty())
{
p=Q.front();
Q.pop();
t=join(p.x,p.y);
if(t)
{
map[p.x][p.y]=1;
a2[t]=p.step;
}
for(i=0;i<4;i++)
{
q=p;
q.x+=dir[i][0];
q.y+=dir[i][1];
q.step+=11;
if(q.x>=0&&q.x<n&&q.y>=0&&q.y<m
&&!map[q.x][q.y]&&str[q.x][q.y]!='#')
{
map[q.x][q.y]=1;
Q.push(q);
}
}
for(i=1;i<k;i++)
{
if(a2[i])b2[i]=a2[i];
else b2[i]=-1;
}
}
}
int main()
{
int i,j;
int x1,x2,y1,y2,min;
while(scanf("%d%d",&n,&m)!=EOF&&n&&m)
{
k=1;
min=100000;
for(i=0;i<n;i++)
scanf("%s",str[i]);
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(str[i][j]=='Y')
{
x1=i;y1=j;
}
if(str[i][j]=='M')
{
x2=i;y2=j;
}
if(str[i][j]=='@')
{
s[k].x=i;
s[k++].y=j;
}
}
}
bfs1(x1,y1);
bfs2(x2,y2);
for(i=1;i<k;i++)
{
if(b1[i]!=-1&&b2[i]!=-1)
{
sum=b1[i]+b2[i];
if(min>sum)
min=sum;
}
}
printf("%d\n",min);
}
return 0;
}
浙公网安备 33010602011771号