bzoj 3503: [Cqoi2014]和谐矩阵

3503: [Cqoi2014]和谐矩阵

Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special Judge
Submit: 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
#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;
}
原文地址:https://www.cnblogs.com/thmyl/p/8877338.html