bzoj 3503: [Cqoi2014]和谐矩阵
3503: [Cqoi2014]和谐矩阵
Time Limit: 10 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 1236 Solved: 584
[Submit][Status][Discuss]
Description
我们称一个由0和1组成的矩阵是和谐的,当且仅当每个元素都有偶数个相邻的1。一个元素相邻的元素包括它本
身,及他上下左右的4个元素(如果存在)。
给定矩阵的行数和列数,请计算并输出一个和谐的矩阵。注意:所有元素为0的矩阵是不允许的。
Input
输入一行,包含两个空格分隔的整数m和n,分别表示矩阵的行数和列数。
Output
输出包含m行,每行n个空格分隔整数(0或1),为所求矩阵。测试数据保证有解。
Sample Input
4 4
Sample Output
0 1 0 0
1 1 1 0
0 0 0 1
1 1 0 1
数据范围
1 <=m, n <=40
1 1 1 0
0 0 0 1
1 1 0 1
数据范围
1 <=m, n <=40
#include<iostream> #include<cstdio> #include<cstring> #define maxn 2010 using namespace std; int id[50][50],a[maxn][maxn],b[maxn],ans[maxn],n,m,cnt; int dx[5]={0,0,0,1,-1}; int dy[5]={0,1,-1,0,0}; void Gauss(int n){ for(int i=1;i<=n;i++){ bool flag=0; for(int j=i;j<=n;j++) if(a[j][i]){ for(int k=1;k<=n;k++)swap(a[i][k],a[j][k]); flag=1;break; } if(!flag)continue; for(int j=i+1;j<=n;j++) if(a[j][i]) for(int k=i;k<=n;k++)a[j][k]^=a[i][k]; } for(int i=n;i>=1;i--){ ans[i]=a[i][i]?b[i]:1; if(ans[i]) for(int j=1;j<=i-1;j++)if(a[j][i])b[j]^=1; } } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)id[i][j]=++cnt; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) for(int k=0;k<=4;k++){ int t1=id[i][j]; int t2=id[i+dx[k]][j+dy[k]]; if(t2)a[t1][t2]=1; } Gauss(cnt); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++) printf("%d ",ans[id[i][j]]); puts(""); } return 0; }