1 条题解

  • 0
    @ 2025-4-17 15:54:57

    思路:要找出图中一条最长的路。先从任意一点开始用bfs把迷宫遍历一遍。然后找到那些距离bfs起点最远的点,然后用这些点再bfs一遍,就可以找到一条最长路了。

    #include<iostream>
    #include<cstring>
    #include<cmath>
    #include<queue>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    int v[1001][1001];
    int d[4][2]={-1,0,0,-1,1,0,0,1};
    char s[1001][1001];
    int n,m;
    int bfs(int x,int y)
    {
        memset(v,0,sizeof v);
        int ans=1;
        v[x][y]=1;
        queue<int>p;
        p.push(x);
        p.push(y);
        while(!p.empty())
        {
            x=p.front();p.pop();
            y=p.front();p.pop();
            ans=max(ans,v[x][y]);
            for(int i=0;i<4;i++)
            {
                int nx=x+d[i][0];
                int ny=y+d[i][1];
                if(nx>=0&&nx<n&&ny>=0&&ny<m&&s[nx][ny]=='.'&&v[nx][ny]==0)
                {
                    v[nx][ny]=v[x][y]+1;
                    p.push(nx);
                    p.push(ny);
                }
            }
     
        }
        return ans-1;
    }
    int main()
    {
        int T;cin>>T;
        while(T--)
        {
            memset(v,0,sizeof v);
            scanf("%d%d",&m,&n);
            for(int i=0;i<n;i++)scanf("%s",s[i]);
            int ans=0;
            for(int i=0;i<n;i++)  //第一次bfs
            {
                for(int j=0;j<m;j++)
                {
                    if(s[i][j]=='.'&&v[i][j]==0)bfs(i,j);
                    ans=max(ans,v[i][j]);
     
                }
            }
            vector<int>p;
            for(int i=0;i<n;i++) //把最远的点找出来放入p里面
            {
                for(int j=0;j<m;j++)
                {
                    if(ans==v[i][j])p.push_back(i),p.push_back(j);
                }
            }
            ans=0;
            for(int i=0;i<p.size();i+=2) //第二次bfs求最长路
            {
                ans=max(ans,bfs(p[i],p[i+1]));
            }
            printf("Maximum rope length is %d.\n",ans);
        }
        return 0;
    }
    • 1

    信息

    ID
    384
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    11
    已通过
    2
    上传者