• 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
    ",ans*11);
    79     }
    80     return 0;
    81 }
    View Code
  • 相关阅读:
    windbg 内核模式调试用户进程
    深发展银行编码器(解剖)
    SIM300常用命令
    tdi驱动 for vista or later
    vm命令行控制 (vmrun)
    WMI事件监控
    Visual C++ 中 #pragma 指示符的使用
    IOCP开发的几个概念
    移动web.config文件时造成的错误,
    提高网站速度|页面优化
  • 原文地址:https://www.cnblogs.com/-maybe/p/4379163.html
Copyright © 2020-2023  润新知