杭电2612 Find a way BFS 搜索

来源:互联网 发布:用单片机测量电能 编辑:程序博客网 时间:2024/05/17 08:32

题意:很多家肯德基店,求两个人去同一家的总的最短时间
#include<cstdio>  #include<cstring>  #include<iostream>  #include<queue>  using namespace std;  #define min(a,b) (a)>(b)?(b):(a)  #define INF 1<<29  #define N 205  int dir[4][2]={{-1,0}, {1,0}, {0,-1}, {0,1}};  int foot1[N][N];  int foot2[N][N];  bool visit[N][N];  char map[N][N];  int n,m,Yx,Yy,Mx,My;  struct node  {    int x,y,sum;  };  void Init()  {     int i;     for(i=0;i<=m+1;i++)     {        map[0][i]='#';        map[n+1][i]='#';     }     for(i=0;i<=n+1;i++)     {        map[i][0]='#';        map[i][m+1]='#';     }  }  void bfsY(int x,int y)  {      int i;     node p,q;     queue<node> Q;     p.x=x;p.y=y;p.sum=0;     memset(foot1,0,sizeof(foot1));     memset(visit,false,sizeof(visit));     visit[p.x][p.y]=true;     foot1[p.x][p.y]=0;     Q.push(p);     while(!Q.empty())     {        p=Q.front();Q.pop();        for(i=0;i<4;i++)        {           q.x=p.x+dir[i][0];           q.y=p.y+dir[i][1];           q.sum=p.sum+1;           if(!visit[q.x][q.y]&&map[q.x][q.y]!='#')           {              visit[q.x][q.y]=true;              foot1[q.x][q.y]=q.sum;              Q.push(q);           }        }     }  }  void bfsM(int x,int y)  {      int i;     node p,q;     queue<node> Q;     p.x=x;p.y=y;p.sum=0;     memset(foot2,0,sizeof(foot2));     memset(visit,false,sizeof(visit));     visit[p.x][p.y]=true;     foot2[p.x][p.y]=0;     Q.push(p);     while(!Q.empty())     {        p=Q.front();Q.pop();        for(i=0;i<4;i++)        {               q.x=p.x+dir[i][0];               q.y=p.y+dir[i][1];               q.sum=p.sum+1;           if(!visit[q.x][q.y]&&map[q.x][q.y]!='#')           {                             visit[q.x][q.y]=true;              foot2[q.x][q.y]=q.sum;              Q.push(q);           }        }     }  }  int main()  {      int i,j;     char ch[205];     while(scanf("%d%d",&n,&m)!=EOF)     {         Init();         for(i=1;i<=n;i++)         {            scanf("%s",ch);            for(j=0;j<m;j++)            {               map[i][j+1]=ch[j];               if(ch[j]=='Y')               {                   Yx=i;Yy=j+1;               }               if(ch[j]=='M')               {                  Mx=i;My=j+1;               }            }         }         bfsY(Yx,Yy);         bfsM(Mx,My);         int ans=INF;         for(i=1;i<=n;i++)             for(j=1;j<=m;j++)             {                if(map[i][j]=='@'&&foot1[i][j]&&foot2[i][j])//注意不是每个KFC Y和M都能到达                {                   ans=min(ans,foot1[i][j]+foot2[i][j]);                }             }          printf("%d\n",ans*11);     }     return 0;  }  

写法二

#include<stdio.h>#include<string.h>#include<iostream>#include<queue>using namespace std;#define INF 0x3f3f3f3f#define N 210int n, m;char maps[N][N];int vis[N][N], dis[N][N][2], f;int dir[4][2]={{1,0}, {0,1}, {-1,0}, {0,-1}};struct node{    int x, y, step;};queue <node> q;void BFS(int x, int y){    node head, next;    head.x=x;    head.y=y;    head.step=0;    vis[x][y]=1;    q.push(head);    while(!q.empty())    {        head=q.front();        q.pop();        for(int i=0; i<4; i++)        {            next.x=head.x+dir[i][0];            next.y=head.y+dir[i][1];            if(next.x>=0&&next.x<n&&next.y>=0&&next.y<m&&!vis[next.x][next.y]               &&(maps[next.x][next.y]=='.'||maps[next.x][next.y]=='@'))            {                vis[next.x][next.y]=1;                next.step=head.step+1;                if(maps[next.x][next.y]=='@')                    dis[next.x][next.y][f]=min(dis[next.x][next.y][f], next.step);                q.push(next);            }        }    }}int main(){    while(~scanf("%d%d", &n, &m))    {        memset(dis, INF, sizeof(dis));        for(int i=0; i<n; i++)            scanf("%s", maps[i]);        for(int i=0; i<n; i++)        for(int j=0; j<m; j++)        {            if(maps[i][j]=='Y')            {                f=0;                memset(vis, 0, sizeof(vis));                BFS(i, j);            }            else if(maps[i][j]=='M')            {                f=1;                memset(vis, 0, sizeof(vis));                BFS(i, j);            }        }        int ans=INF;        for(int i=0; i<n; i++)        for(int j=0; j<m; j++)        {            if(maps[i][j]=='@'&&ans>dis[i][j][0]+dis[i][j][1])                ans=dis[i][j][0]+dis[i][j][1];        }        printf("%d\n", ans*11);    }}



0 0
原创粉丝点击