HDU-2612-Find a way
http://acm.hdu.edu.cn/showproblem.php?pid=2612
求2个点到KFC的距离之和,使其最小,可用2次BFS,分别求出2个点到各个KFC的最短距离,然后找出和最小的即可
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define max 0x7fffffff
int n,m;
char map[250][250];
int visit1[250][250];
int visit2[250][250];
int ans1[250][250];
int ans2[250][250];
struct cam
{
int x,y;
}list[80000];
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
int go(int x,int y)
{
if(0<=x&&x<n&&0<=y&&y<m&&map[x][y]!='#')
return 1;
return 0;
}
void bfs(int x,int y,int visit[250][250],int ans[250][250])
{
int i,head,tail;
int xx,yy;
memset(visit,0,sizeof(visit));
memset(ans,0,sizeof(ans));
visit[x][y]=1;
ans[x][y]=0;
list[0].x=x;
list[0].y=y;
head=0;
tail=1;
while(head<tail)
{
x=list[head].x;
y=list[head].y;
for(i=0;i<4;i++)
{
xx=x+dir[i][0];
yy=y+dir[i][1];
if(go(xx,yy)&&!visit[xx][yy])
{
list[tail].x=xx;
list[tail].y=yy;
ans[xx][yy]=ans[x][y]+1;
visit[xx][yy]=1;
tail++;
}
}
head++;
}
}
int main()
{
int i,j;
int x1,y1,x2,y2;
int min;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=0;i<n;i++)
scanf("%s",map[i]);
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
if(map[i][j]=='Y')
{
x1=i;
y1=j;
}
else if(map[i][j]=='M')
{
x2=i;
y2=j;
}
}
memset(visit1,0,sizeof(visit1));
memset(ans1,0,sizeof(ans1));
bfs(x1,y1,visit1,ans1);
memset(visit2,0,sizeof(visit2));
memset(ans2,0,sizeof(ans2));
bfs(x2,y2,visit2,ans2);
min=max;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
if(map[i][j]=='@'&&visit1[i][j]&&visit2[i][j])
if(min>ans1[i][j]+ans2[i][j])
min=ans1[i][j]+ans2[i][j];
}
printf("%d\n",min*11);
}
return 0;
}