杭電2612 Find a way BFS 搜索

題意:很多家肯德基店,求兩個人去同一家的總的最短時間
#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 210

int 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);
    }
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章