hdu 2612

#include"stdio.h"

#include"string.h"



int tab[4][2]={0,1,1,0,0,-1,-1,0};

int vis1[205][205],count,vis2[205][205];

int n,m;

int note[40002][2];

char a[205][205];

int yi[2],me[2],con[205][205];



void bfs(int x1,int y1,int vis[205][205])

{

    int xx,yy,x,y,i;

    int q[40005],rear=1,front=0;

    q[front]=1000*x1+y1;

    vis[x1][y1]=0;

    while(front<rear)

    {

        x=q[front]/1000;

        y=q[front]%1000;

        for(i=0;i<4;i++)

        {

            xx=x+tab[i][0];

            yy=y+tab[i][1];

            if(a[xx][yy]=='#'||xx<0||xx>=n||yy<0||yy>m||vis[xx][yy]!=-1)

                continue;

            q[rear++]=1000*xx+yy;

            vis[xx][yy]=vis[x][y]+1;//记录下走到此位置所需的步数;

            if(a[xx][yy]=='@')

                con[xx][yy]+=vis[xx][yy];        

        }

        front++;

    }

}



void input()

{

    int i,j;

    for(i=0;i<n;i++)

        {

            for(j=0;j<m;j++)

            {

                scanf("%c",&a[i][j]);

                if(a[i][j]=='@')

                {note[count][0]=i;note[count][1]=j;count++;}

                if(a[i][j]=='Y')

                {yi[0]=i;yi[1]=j;}

                if(a[i][j]=='M')

                {me[0]=i;me[1]=j;}

            }

            getchar();

        }

}



int main( )

{

    int i,j,sum,max,w;

    while(~scanf("%d%d",&n,&m))

    {

        count=0;

        max=99999999;

        getchar();

        input();

        memset(con,0,sizeof(con));

        memset(vis1,-1,sizeof(vis1));

        bfs(yi[0],yi[1],vis1);

        memset(vis2,-1,sizeof(vis2));

        bfs(me[0],me[1],vis2);

        for(i=0;i<count;i++)

            if(max>con[note[i][0]][note[i][1]]&&vis1[note[i][0]][note[i][1]]!=-1&&vis2[note[i][0]][note[i][1]]!=-1)

                max=con[note[i][0]][note[i][1]];

        printf("%d\n",max*11);

    }

    return 0;

}



        

    

 

这几个题做得怎么都这么坎坷呢。

注意这题是一次性搜出一个出发点到各个目的地的步数,否则会超时。

代码如下:

 

你可能感兴趣的:(HDU)