• Find a way (BFS ➕ 标记数组)


    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2612

    题目大意:

    M和Y想要在KFC见面,现在让你去找到一个使两个人到同一个KFC总花费时间最小的地方,然后输出最小的花费时间 (花费时间 = 步数*11)

    思路:

    先对M跑一次BFS并且用一个数组记录它到不同KFC的时间

    再对Y跑一次BFS并且用另一个数组记录它到不同KFC的时间

    然后遍历这两个数组,找到它们到同一个KFC花费的最小时间

    具体代码:

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <queue>
     4 #include <algorithm>
     5 #define inf 0x6ffffff
     6 using namespace std;
     7 char map[202][202];// 地图
     8 int vis[202][202];//  标记数组
     9 int flag1[202][202];//记录M到达任意KFC的时间
    10 int flag[202][202];//记录Y到达任意KFC的时间
    11 int n,m;
    12 int x1,y1,x2,y2;
    13 int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
    14 struct node
    15 {
    16     int x,y,step;
    17 }
    18 ;
    19 bool check(int x,int y)
    20 {
    21     if(x<0 ||y<0 ||x>=n ||y>=m ||map[x][y]=='#' ||vis[x][y]) //检查是否越界,是否已经搜过
    22         return 0;
    23     return 1;
    24 }
    25 void bfs(int x,int y,int a[][202]) //进入坐标和记录数组
    26 {
    27     int i;
    28     node st,ed;
    29     queue<node>q;
    30     st.x=x;
    31     st.y=y;
    32     st.step=0;
    33     q.push(st);
    34     while(!q.empty())
    35     {
    36         st=q.front();
    37         q.pop();
    38         for(i=0;i<4;i++)
    39         {
    40             ed.x=st.x+dir[i][0];
    41             ed.y=st.y+dir[i][1];
    42             if(!check(ed.x,ed.y))
    43                 continue;
    44             ed.step=st.step+1;
    45             vis[ed.x][ed.y]=1;
    46             if(map[ed.x][ed.y]=='@')
    47             {
    48                 a[ed.x][ed.y]=ed.step;
    49             }
    50             q.push(ed);
    51         }
    52     }
    53 }
    54 int main()
    55 {
    56     int i,j;
    57     while(~scanf("%d%d",&n,&m))
    58     {
    59         memset(flag,0,sizeof(flag));
    60         memset(vis,0,sizeof(vis));
    61         memset(flag1,0,sizeof(flag1));//全部初始化
    62         for(i=0;i<n;i++)
    63             scanf("%s",map[i]);
    64         for(i=0;i<n;i++)
    65             for(j=0;j<m;j++)
    66             {
    67                 if(map[i][j]=='Y')
    68                 {
    69                     x1=i;
    70                     y1=j;
    71                 }
    72                 if(map[i][j]=='M')
    73                 {
    74                     x2=i;
    75                     y2=j;
    76                 }
    77             }
    78             vis[x1][y1]=1;
    79             bfs(x1,y1,flag);//一遍BFS之后
    80             memset(vis,0,sizeof(vis));//初始化
    81             vis[x2][y2]=1;
    82             bfs(x2,y2,flag1);  //再跑一遍BFS。
    83             int min=inf;
    84             for(i=0;i<n;i++)
    85                 for(j=0;j<m;j++) //遍历整个地图、
    86                 {
    87                     if(min>flag[i][j]+flag1[i][j] &&flag[i][j] &&flag1[i][j])//有值的地方说明有KFC,找出两个人同时到达一个KFC的最短时间
    88                         min=flag[i][j]+flag1[i][j];
    89                 }
    90                 printf("%d
    ",min*11);//每走一步为11分钟。
    91     }
    92     return 0;
    93 }
  • 相关阅读:
    hdu2896 病毒肆虐【AC自动机】
    poj1066 Treasure Hunt【计算几何】
    vue教程3-webpack搭建项目
    棋牌手游在线人数监控系统
    vue教程2-组件化开发
    vue教程1-初体验
    DRF教程6-分页
    DRF教程5-API接口文档和接口测试
    DRF教程4-视图集和路由类
    DRF教程3-类视图
  • 原文地址:https://www.cnblogs.com/-Ackerman/p/11197495.html
Copyright © 2020-2023  润新知