题目:构造一个只有01的n*n的矩阵,要求每一行和列的和为0-n-1的排列,且1和0的连通块的数量均为n

知识点:构造

思路:

其实挺简单,首先我们不管联通块,一定可以构造出行列和为0-n-1的排列,如图: alt

然后再考虑连通块,只能排列所有情况后用bfs打表(或者小范围自己手搓),然后我们可以得到这样的矩阵:alt

然后就很简单了,每偶数行和列赋1即可

using namespace std;
const int N=1e3+9;
int n;
vector<vector<int>> a(N,vector<int>(N,0));
void slove(int begin) {
    for(int i=begin;i<=n;i++) {
        a[begin][i]=1;
        a[i][begin]=1;
    }
}
int main() {
     cin>>n;
    for(int i=2;i<=n;i++) {
        if(i%2==0) slove(i);
    }
    for(int i=1;i<=n;i++) {
        for(int j=1;j<=n;j++) {
            cout<<a[i][j];
        }
        cout<<endl;
    }
}