HDU2612 Find a Way BFS

题意:

yifenfei和merceki要去KFC聚会,给出一个地方的地图,n*m,有若干个个KFC,然后他们每走一步需要11分钟(注意:这里时间不能重叠的,比如yi走了一步,me也是走了一步,则一共的时间为2*11,而不是1*11),问他们在哪个KFC聚会所花的时间最少,输出最少的时间。

这道题我本来是想,枚举每一个KFC,分别对每一个KFC进行2次BFS,求出去每一个KFC所花的时间。觉得这样很慢吧。

后来就是,先对yi,求出他到每一个KFC的时间,记录下来,再对me,求出他到每一个KFC的时间,记录下来,再选择哪个好,这样一共只需要2次BFS就ok了。

ac代码:

 1 #include<cstdio>

 2 #include<queue>

 3 #include<algorithm>

 4 #include<cstring>

 5 using namespace std;

 6 const int maxn=210;

 7 int y[maxn][maxn];

 8 int k[maxn][maxn];

 9 char maze[maxn][maxn];

10 int dx[4]={0,0,-1,1};

11 int dy[4]={1,-1,0,0};

12 int n,m;

13 bool vis[maxn][maxn];

14 struct Point

15 {

16     int x,y,step;

17 };

18 void bfs(int i,int j,int who)

19 {

20     memset(vis,false,sizeof(vis));

21     Point s;

22     s.x=i;

23     s.y=j;

24     s.step=0;

25     queue<Point>que;

26     while(!que.empty())

27         que.pop();

28     que.push(s);

29     vis[i][j]=true;

30     while(!que.empty()){

31         Point u=que.front();

32         que.pop();

33         if(maze[u.x][u.y]=='@'&&who==1){

34             y[u.x][u.y]=u.step;

35         }

36         else if(maze[u.x][u.y]=='@'&&who==2){

37             k[u.x][u.y]=u.step;

38         }

39         for(int i=0;i<4;i++){

40             Point du;

41             du.x=u.x+dx[i];

42             du.y=u.y+dy[i];

43             du.step=u.step+1;

44             if(du.x>=0&&du.x<n&&du.y>=0&&du.y<m&&maze[du.x][du.y]!='#'

45                &&!vis[du.x][du.y]){

46                 que.push(du);

47                 vis[du.x][du.y]=true;

48                }

49         }

50     }

51 }

52 int main()

53 {

54     while(scanf("%d%d",&n,&m)!=EOF){

55         char s[maxn];

56         for(int i=0;i<n;i++){

57             scanf("%s",&s);

58             for(int j=0;j<m;j++)

59                 maze[i][j]=s[j];

60         }

61         memset(y,-1,sizeof(y));

62         memset(k,-1,sizeof(m));

63         for(int i=0;i<n;i++){

64             for(int j=0;j<m;j++){

65                 if(maze[i][j]=='Y'){

66                     bfs(i,j,1);

67                 }

68                 else if(maze[i][j]=='M')

69                     bfs(i,j,2);

70             }

71         }

72         int ans=0x3f3f3f3f;

73         for(int i=0;i<n;i++)

74             for(int j=0;j<m;j++){

75                 if(y[i][j]!=-1&&k[i][j]!=-1&&y[i][j]+k[i][j]<ans)

76                     ans=y[i][j]+k[i][j];

77         }

78         printf("%d\n",ans*11);

79     }

80     return 0;

81 }
View Code

 

你可能感兴趣的:(find)