• HDU 2612 Find a way BFS,防止超时是关键


    之前我写的时候是:每找到一个‘@’就广搜一次,如果这样写有多少个‘@’就会广搜几次,这样就超时了。我队友告诉我应该打个表,这个方法确实不错。因为'Y'和'M'是唯一的,我通过这两个点分别广搜一次,对所有到达‘@’的情况打个表,这样就节省了很多时间。具体看代码吧。

    #include<cstdio>
    #include<stdio.h>
    #include<cstdlib>
    #include<cmath>
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<vector>
    #include<queue>
    #define INF 0x3f3f3f3f
    #define MAX 1005
    
    using namespace std;
    
    int n,m,vis[MAX][MAX],v[4][2]= {{0,1},{0,-1},{1,0},{-1,0}},Time[MAX][MAX],b[MAX][MAX];
    char Map[MAX][MAX];
    
    struct node
    {
        int x,y,step;
    };
    
    void BFS(int sx,int sy)
    {
        memset(vis,0,sizeof(vis));
        queue<node>Q;
        node a,next;
        a.x=sx;
        a.y=sy;
        a.step=0;
        Q.push(a);
        vis[sx][sy]=1;
        while(!Q.empty())
        {
            a=Q.front();
            Q.pop();
    
            if(Map[a.x][a.y]=='@' && !b[a.x][a.y])//数组b记录是否到达过这个‘@’
            {
                b[a.x][a.y]=1;
                Time[a.x][a.y]+=a.step*11;
                next.x=sx;
                next.y=sy;
                next.step=0;
                Q.push(next);
            }
    
            for(int i=0; i<4; i++)
            {
                next.x=a.x+v[i][0];
                next.y=a.y+v[i][1];
    
                if(next.x>=0 && next.x<n && next.y>=0 && next.y<m && Map[next.x][next.y]!='#' && !vis[next.x][next.y])
                {
                    vis[next.x][next.y]=1;
                    next.step=a.step+1;
                    Q.push(next);
                }
            }
        }
    }
    
    int main()
    {
        int i,j,ans,x1,x2,y1,y2;
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            ans=INF;
            for(i=0; i<n; i++)
            {
                scanf("%s",Map[i]);
            }
    
            for(i=0; i<n; i++)
            {
                for(j=0; j<m; j++)
                {
                    if(Map[i][j]=='Y')
                    {
                        x1=i;
                        y1=j;
                    }
    
                    if(Map[i][j]=='M')
                    {
                        x2=i;
                        y2=j;
                    }
                }
            }
    
            memset(b,0,sizeof(b));
            memset(Time,0,sizeof(Time));
            BFS(x1,y1);//对‘Y’到达‘@’进行广搜
            memset(b,0,sizeof(b));
            BFS(x2,y2);对‘M’到达‘@’进行广搜
    
            for(i=0;i<n;i++)
            {
                for(j=0;j<m;j++)
                {
                    if(Time[i][j]!=0)
                        ans=min(ans,Time[i][j]);
                }
            }
    
            printf("%d
    ",ans);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    线性筛素数
    redis集成springmvc
    shiro登录权限认证
    jQuery插件
    maven多项目配置
    w
    触发器
    后悔了可以找我我们是朋友
    url upload data
    排队
  • 原文地址:https://www.cnblogs.com/alan-W/p/5676545.html
Copyright © 2020-2023  润新知