Three States

Three States

https://ac.nowcoder.com/acm/problem/111125

吐槽下题目:不愧是cf,真的就是阅读理解,抛开复杂的题意,就是一个广搜,不过需要存三种情况.......
题意:现在有三个地盘,然后要修一条可以连通三个城市的道路,并且要最短,可以穿过其他人的地盘来连通
题解:记忆广搜,以每个点来广搜会超时,但是以每个地盘的数字来进行广搜就可以了
先把一个地盘的所有点压入队列,然后来广搜全局,再用数组记录当前到其他剩余点所需要的时间戳,
然后重复两次
最后遍历全图对于每个点来进行三个时间戳求和,取最小,即答案
时间复杂度:图片说明

#include<bits/stdc++.h>
using namespace std;

struct node
{
    int x,y;
}r,f;
queue<node>Q;
int n,m,T[4][1005][1005],dx[]={0,0,1,-1},dy[]={1,-1,0,0};
char R[1005][1005];
void BFS(int a)
{
    int i,j,X,Y;
    for(i=0;i<n;i++)
        for(j=0;j<m;j++)
        {
            T[a][i][j]=1e8;
            if(R[i][j]-'0'==a)T[a][i][j]=0,r.x=i,r.y=j,Q.push(r);
        }
    while(!Q.empty())
    {
        f=Q.front(),Q.pop();
        for(i=0;i<4;i++)
        {
            X=f.x+dx[i],Y=f.y+dy[i],j=T[a][f.x][f.y];
            if(X<0||X>=n||Y<0||Y>=m||R[X][Y]=='#')continue;
            if(R[X][Y]=='.')j++;
            if(j<T[a][X][Y])T[a][X][Y]=j,r.x=X,r.y=Y,Q.push(r);
        }
    }
}
int main()
{
    int i,j,t,ans=1e8;
    scanf("%d%d",&n,&m);
    for(i=0;i<n;i++)scanf("%s",R[i]);
    BFS(1),BFS(2),BFS(3);
    for(i=0;i<n;i++)
        for(j=0;j<m;j++)
        {
            if(R[i][j]=='#')continue;
            t=T[1][i][j]+T[2][i][j]+T[3][i][j];
            if(R[i][j]=='.')t-=2;
            ans=min(ans,t);
        }
    if(ans==1e8)ans=-1;
    printf("%d\n",ans);
}
全部评论

相关推荐

06-27 12:54
已编辑
门头沟学院 Java
累了,讲讲我的大学经历吧,目前在家待业。我是一个二本院校软件工程专业。最开始选专业是觉得计算机感兴趣,所以选择了他。本人学习计算机是从大二暑假结束开始的,也就是大三开始。当时每天学习,我个人认为Java以及是我生活的一部分了,就这样持续学习了一年半,来到了大四上学期末,大概是在12月中旬,我终于找的到了一家上海中厂的实习,但我发现实习生的工作很枯燥,公司分配的活也不多,大多时间也是自己在自学。就这样我秋招末才找到实习。时间来到了3月中旬,公司说我可以转正,但是转正工资只有7000,不过很稳定,不加班,双休,因为要回学校参加答辩了,同时当时也是心高气傲,认为可以找到更好的,所以放弃了转正机会,回学校准备论文。准备论文期间就也没有投递简历。然后时间来到了5月中旬,这时春招基本也结束了,然后我开始投递简历,期间只是约到了几家下场面试。工资也只有6-7k,到现在我不知道该怎么办了。已经没有当初学习的心劲了,好累呀,但是又不知道该干什么去。在家就是打游戏,boss简历投一投。每天日重一次。26秋招都说是针对26届的人,25怎么办。我好绝望。要不要参加考公、考研、央国企这些的。有没有大佬可以帮帮我。为什么感觉别人找工作都是顺其自然的事情,我感觉自己每一步都在艰难追赶。八股文背了又忘背了又忘,我每次都花很长时间去理解他,可是现在感觉八股、项目都忘完了。真的已经没有力气再去学习了。图片是我的简历,有没有大哥可以指正一下,或者说我应该走哪条路,有点不想在找工作了。
码客明:太累了就休息一下兄弟,人生不会完蛋的
如果实习可以转正,你会不...
点赞 评论 收藏
分享
05-26 22:25
门头沟学院 Java
Java小肖:不会是想叫你过去把你打一顿吧,哈哈哈
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务