zoukankan      html  css  js  c++  java
  • 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;
    }
    
            
        

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

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

    代码如下:

  • 相关阅读:
    C++ Primer学习笔记(三) C++中函数是一种类型!!!
    C++类的成员函数的形参列表后面的const
    C++ const总结
    简单的使用Gson (序列化 和 反序化)
    HTML 获取class里的多个值 和 dataset的使用
    SiteMesh的简单使用
    IDEA 使用LiveEdit插件
    Java 转发和重定向的区别
    Web.xml 定制URL
    java 枚举类(简单使用)
  • 原文地址:https://www.cnblogs.com/chaosheng/p/2505529.html
Copyright © 2011-2022 走看看