find a way

题目:

https://vjudge.net/problem/HDU-2612

思路:用两次bfs

之前wa是没有判两人能否到达麦当劳

#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
int n,m;
int v[202][202],vis[202][202],dy[202][202],dm[202][202];
char h[202][202];
struct mai
{
    int pi,pj;
}ma[202];
queue<mai> que;
struct node
{
    int i,j;
}no[202];
int x[5]={0,0,1,-1};
int yy[5]={-1,1,0,0};
void bfs(node y)
{   queue<node> qq;
    memset(v,0,sizeof(v));
    memset(dy,0,sizeof(dy));
    dy[y.i][y.j]=0;
            v[y.i][y.j]=1;

    qq.push(y);
    while(!qq.empty())
    {
        node r=qq.front();
        qq.pop();
        int ri=r.i;
        int rj=r.j;
        for(int i=0;i<4;i++)
        {
            int ii=ri+x[i];
            int jj=rj+yy[i];
            if(h[ii][jj]!='#'&&!v[ii][jj]&&ii>=1&&ii<=n&&jj>=1&&jj<=m)
            {
                v[ii][jj]=1;
                dy[ii][jj]=dy[ri][rj]+1;
                node z;
                z.i=ii;
                z.j=jj;
                qq.push(z);
            }
        }
    }
}
void bbfs(node ming)
{   queue<node> qw;
    memset(vis,0,sizeof(vis));
    memset(dm,0,sizeof(dm));
    dm[ming.i][ming.j]=0;
        vis[ming.i][ming.j]=1;

    qw.push(ming);
    while(!qw.empty())
    {
        node r=qw.front();
        qw.pop();
        int ri=r.i;
        int rj=r.j;
        for(int i=0;i<4;i++)
        {
            int ii=ri+x[i];
            int jj=rj+yy[i];
            if(h[ii][jj]!='#'&&!vis[ii][jj]&&ii>=1&&ii<=n&&jj>=1&&jj<=m)
            {
                vis[ii][jj]=1;
                dm[ii][jj]=dm[ri][rj]+1;
                node z;
                z.i=ii;
                z.j=jj;
                qw.push(z);
            }
        }
    }
}
int main()
{
    while(scanf("%d %d",&n,&m)!=EOF)
    { node y,ming;
       for(int i=1;i<=n;i++)
       {
           for(int j=1;j<=m;j++)
           {scanf(" %1c",&h[i][j]);
              if(h[i][j]=='@')
              {
                  mai fir;
                  fir.pi=i;
                  fir.pj=j;
                  que.push(fir);
              }
              if(h[i][j]=='Y')
              {
                  y.i=i;
                  y.j=j;
              }
              if(h[i][j]=='M')
              {
                  ming.i=i;
                  ming.j=j;
              }

           }

       }

       bfs(y);
       bbfs(ming);
       int mmin=99999999;
       while(!que.empty())
       {
           mai tt=que.front();
           que.pop();
            if(dy[tt.pi][tt.pj]+dm[tt.pi][tt.pj]<mmin&&v[tt.pi][tt.pj]&&vis[tt.pi][tt.pj])
            {
                mmin=dy[tt.pi][tt.pj]+dm[tt.pi][tt.pj];
            }
       }
       printf("%d\n",mmin*11);
    }
}

 

上一篇:Leetcode 202 快乐数


下一篇:第202题. 快乐数