连通块构造

M-Matrix Problem_第十一届山东省大学生程序设计竞赛(正式赛)

理论上写的第二个构造题,我原来想的是把1固定住,然后把a变连通,然后反过来的1变成0固定住,然后把b变连通

变连通就是把分散开来的连通块合并到一起

hhh

想法很单纯,我纠结了好久不知道怎么变连通

这个就是连通块的构造题了,这种矩阵,可以首先想到的是它的奇偶性,按照奇偶性来构造

把a的偶数行变为1,b的奇数行变为1,然后相交错开,可以保证了原来的矩阵都是0,(固定的1除外,这个当然ab的那个位置都是1)

然后可以极大程度上的保证了矩阵的连通,因为错开的是连通的,假设错开的中间这一行有一个原本的1,那必然变连通

那如果没有怎么办,就用到四周的0了,创造出来一个1,这时候可以把a的左边界变成1,那a就连通了,b同理,如果有一行空出来,那右边的边界是1

题目蛮好的

但是读完题目是可以一次性看出来做法的,还是我做题太少,见的太少

复制代码
#include<iostream>
using namespace std;
const int N=1010;
char ch[N][N];
int a[N][N],b[N][N];
int main(){
    int n,m;
    cin>>n>>m;
    for(int i=0;i<n;i++) cin>>ch[i];
    for(int i=0;i<n-1;i++)
    {
        if(i%2==0)//a偶行都是0,b偶行都是1 
        {
            for(int j=1;j<m-1;j++)
            {
                int x=ch[i][j]-'0';
                if(x) a[i][j]=1,b[i][j]=1;
                else
                {
                    a[i][j]=0;
                    b[i][j]=1;
                }
            }
        }
        else if(i%2==1)
        {
            for(int j=1;j<m-1;j++)
            {
                int x=ch[i][j]-'0';
                if(x) a[i][j]=1,b[i][j]=1;
                else
                {
                    a[i][j]=1;
                    b[i][j]=0;
                }
            }        
        }
    }
    for(int i=0;i<n;i++) a[i][0]=1,b[i][m-1]=1;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
            cout<<a[i][j];
        cout<<endl;
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
            cout<<b[i][j];
        cout<<endl;
    }
    return 0;
}
/*
构造:
分奇偶,可以保证c的相应位置是0,1就固定1
然后如果有大于等于一行不连通,就改变左右两边 

*/
复制代码

 

posted @   小志61314  阅读(67)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示