1 條題解

  • 0
    @ 2023-10-18 10:01:26

    C++ :

    #include<bits/stdc++.h>
    using namespace std;
    const int N=55;
    int st[N][N];
    int g[N][N];
    int dx[]={0,-1,0,1}; //左上右下
    int dy[]={-1,0,1,0};
    int color[N*N];
    char chs[]={'W','N','E','S'}; //西北东南
    typedef pair<int,int> PII;
    #define x first
    #define y second
    int n,m;
    int bfs(int x,int y,int c)
    {
        queue<PII> q;
        q.push({x,y});
        st[x][y]=c;
        int tot=1; //联通块大小
        while(q.size())
        {
            PII t=q.front();
            q.pop();
            for(int i=0;i<4;i++)
            {
                if(!(g[t.x][t.y]>>i&1)) //没有墙
                {
                    int a=t.x+dx[i],b=t.y+dy[i]; //计算可以走到的点
                    if(a<0||a>=n||b<0||b>=m) continue; //越界
                    if(st[a][b]) continue; //已经有颜色了
                    st[a][b]=c; //染色
                    tot++; //连通块大小增加
                    q.push({a,b}); //入队
                }
            }
        }
        return tot; //返回连通块大小
    }
    int main()
    {
        cin>>m>>n;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                cin>>g[i][j];
            }
        }
        int cnt=0,maxv=0;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                if(!st[i][j])
                {
                    cnt++; //当前连通块需要染成的颜色
                    color[cnt]=bfs(i,j,cnt); //对应颜色的大小
                    maxv=max(maxv,color[cnt]); //更新最大值
                }
            }
        }
        cout<<cnt<<endl<<maxv<<endl;
        maxv=0;
        int row,col;
        char d;
        for(int j=0;j<m;j++)
        {
            for(int i=n-1;i>=0;i--)
            {
                for(int k=1;k<=2;k++)
                {
                    if(g[i][j]>>k&1) //当前位置是墙
                    {
                        int a=i+dx[k],b=j+dy[k];
                        if(a<0||a>=n||b<0||b>=m) continue;
                        int c1=st[i][j],c2=st[a][b];
                        if(c1!=c2) //如果颜色不相等
                        {
                            
                            int c=color[c1]+color[c2]; //计算去掉墙以后的连通块大小
                            if(c>maxv) //可以更新最大值
                            {
                                maxv=c;
                                row=i,col=j,d=chs[k];
                            }
                        }
                    }
                }
            }
        }
        cout<<maxv<<endl;
        cout<<row+1<<" "<<col+1<<" "<<d;
        return 0;
    }
    
    • 1

    資訊

    ID
    787
    時間
    1000ms
    記憶體
    128MiB
    難度
    (無)
    标签
    遞交數
    0
    已通過
    0
    上傳者