1126: 布尔矩阵的奇偶性
题目描述
一个布尔方阵具有奇偶均势特性,当且仅当 每行、每列总和为偶数,即包含偶数个1。如下面这个4*4的矩阵就具有奇偶均势特性:
1 0 1 0
0 0 0 0
1 1 1 1
0 1 0 1
编写程序,读入一个n阶方阵并检查它是否具有奇偶均势特性。如果没有,你的程序应当再检查一下它是否可以通过修改一位(把0改为1,把1改为0)来使它具有奇偶均势特性;如果不可能,这个矩阵就被认为是破坏了。
输入
第一行是一个整数n ( 0< n < 100 ),代表该方阵的阶数。然后输入n 行,每行n个整数(0或1)。
输出
如果矩阵是布尔矩阵,输出“OK”;如果能通过只修改该矩阵中的一位来使它成为布尔矩阵,则输出“Change bit(i,j)”,这里i和j是被修改的元素的行与列(行,列号从0开始);否则,输出“Corrupt”。
样例输入
4
1 0 1 0
0 0 0 0
1 1 1 1
0 1 0 1
样例输出
OK
题目链接 ZZULI OJ 1126
题解及注释(C++)
#include<iostream>
#define N 100
using namespace std;
int IsGood(int a[][N], int n); //判断每行是否满足偶均势矩阵
int Change(int a[][N], int n); //将矩阵求转置,判断转置后的每行是否满足偶均势矩阵
int Boooool(int n); //此函数用于变换0和1
int main()
{
int n,a[N][N],flag=0; //flag变量记录是否被破坏
cin>>n;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin>>a[i][j];
if(IsGood(a,n)&&Change(a,n)) //判断是否是奇偶均势矩阵
{
flag=1;
cout<<"OK";
}
else
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
a[i][j]=Boooool(a[i][j]); //再判断是否可以通过修改一位变为奇偶均势矩阵
if(IsGood(a,n)&&Change(a,n))
{
cout<<"Change bit("<<i<<","<<j<<")";
flag=1;
}
a[i][j]=Boooool(a[i][j]); //还原数组
}
}
if(flag==0) cout<<"Corrupt"; //若都无法完成,flag不变,则说明是被破坏矩阵
return 0;
}
int IsGood(int a[][N], int n)
{
int sum=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
sum+=a[i][j]; //逐行求和,再判断
if(sum%2!=0) return 0;
sum=0;
}
return 1;
}
int Change(int a[][N], int n)
{
int b[N][N]; //用一个新数组放置转置后的数组
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
b[j][i]=a[i][j]; //行变为列,列变为行
if(IsGood(b,n)) return 1; //再次调用,判断转置后每行是否满足偶均势矩阵
else return 0;
}
int Boooool(int n) //此函数用于变换0和1
{
if(n==1) return 0;
else return 1;
}