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

        
    

 

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

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

代码如下:

 

posted @ 2012-05-16 23:08  朝圣の路  阅读(417)  评论(0编辑  收藏  举报