和谐矩阵java实现_[CQOI2014] 和谐矩阵 - 高斯消元,构造

称一个由 \(0\) 和 \(1\) 组成的矩阵是和谐的,当且仅当每个元素都有偶数个相邻的1。一个元素相邻的元素包括它本身,及他上下左右的 \(4\) 个元素。给定矩阵的行数和列数,请计算并输出一个和谐的矩阵。注意所有元素为0的矩阵是不允许的。

Solution

即对于矩阵中的每一个点 \((x,y)\),需要求出一种方案使得

\[a[x][y] \oplus a[x+1][y] \oplus a[x-1][y] \oplus a[x][y+1] \oplus a[x][y-1] = 0

\]

于是我们列出了 \(nm\) 个方程,共有 \(nm\) 个未知量,高斯消元即可

#include

using namespace std;

const int N = 45;

const int dx[]={0,0,0,-1,1},dy[]={0,-1,1,0,0};

int n,m,id[N][N],ans[N*N];

bitset a[N*N];

void gauss() {

for(int i=1;i<=n*m;i++) {

for(int j=i;j<=n*m;j++) {

if(a[j][i]>0) {

swap(a[i],a[j]);

break;

}

}

if(!a[i][i]) ans[i]=1;

for(int j=i+1;j<=n*m;j++) {

if(a[j][i]) a[j]^=a[i];

}

}

for(int i=n*m;i>=1;--i) {

for(int j=i+1;j<=n*m;j++) {

ans[i]^=(ans[j]*a[i][j]);

}

}

}

signed main() {

cin>>n>>m;

for(int i=1;i<=n;i++) {

for(int j=1;j<=m;j++) {

id[i][j]=(i-1)*m+j;

}

}

for(int i=1;i<=n;i++) {

for(int j=1;j<=m;j++) {

for(int k=0;k<=4;k++) {

int x=i+dx[k],y=j+dy[k];

if(x>=1 && y>=1 && x<=n && y<=m) {

a[id[i][j]][id[x][y]]=1;

}

}

}

}

gauss();

for(int i=1;i<=n;i++) {

for(int j=1;j<=m;j++) {

cout<

}

cout<

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值