我把此条件“编写程序,读入一个n阶方阵并检查它是否具有奇偶均势特性(juxing(int n,int a[101][101])。如果没有,你的程序应当再检查一下它是否可以通过修改一位(把0改为1,把1改为0)来使它具有奇偶均势特性;如果不可能,这个矩阵就被认为是破坏了(change(int n,int a[101][101])。”拆成了两个副函数,以简化主函数,也更容易使思路展开。
#include"stdio.h"
int juxing(int n,int a[101][101])/*定义一个可以判断是否满足布尔矩形的函数,
(此函数可以满足题目第一个句号之前的条件)*/
{
int i,j,s1=0,s2=0;//s1,s2均为标志变量
for(i=0;i<n;i++)
{
int sum1=0;
for(j=0;j<n;j++)
sum1=a[i][j]+sum1;
if(sum1%2!=0)//只要有一行不满足题设,即改变标志变量s1
s1=1;
}
for(j=0;j<n;j++)
{
int sum2=0;
for(i=0;i<n;i++)
sum2=sum2+a[i][j];
if(sum2%2!=0)//只要有一列不满足题设,即改变标志变量s2
s1=1;
}
if(s1==0&&s2==0)//两者皆符合
return 1;
else
return 0;
}
void change(int n,int a[101][101])/*定义一个函数,在不满足布尔均势性时,判断能否通过
只改变一个数的值来是数组满足(此函数对应题目的第一与第二个句号之间的条件)*/
{
int i,j,flag=1;/*flag同为标志变量。(但是这次使用的标志变量起到结束循环的目的
一开始没想到此方法,一直用while语句调试,不仅冗长麻烦,而且一直错)*/
for(i=0;i<n&&flag!=0;i++)
{
for(j=0;j<n&&flag!=0;j++)
{
if(a[i][j]==1)
a[i][j]=0;
else
a[i][j]=1;
if(juxing(n,a)==1)//经过对此a[i][j]元素的改变,使其满足
{
flag=0;//结束所有循环
printf("Change bit(%d,%d)",i,j);
}
if(a[i][j]==0)
a[i][j]=1;
else
a[i][j]=0;/*读者不妨想一想if语句已经使数组满足了布尔奇偶均势性,
下一步就要结束循环。为何还要使这个元素的值变过来呢?*/
}
}
if(flag==1)//未能找到
printf("Corrupt");
}
int a[101][101];//开辟数组长度
int main()
{
int n,i,j;
scanf("%d",&n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
if(juxing(n,a))//如果行的话,输出OK
printf("OK");
else//否则进入chang函数进行判断
change(n,a);
}