一个布尔方阵具有奇偶均势特性,当且仅当 每行、每列总和为偶数,即包含偶数个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
#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; }