题目大意:
一个boolean矩阵有个特性,每行和每列都有偶数和。你的工作是检查一个矩阵是否有这个特性,如果没有,你的程序应该检查只需修改一位,是否具有这个特性。如果也不可能,则这个矩阵被分类为corrupt。
解题思路:
把每行、每列的和加起来,分别检查,如果每行或者每列都有两个或以上sum不是偶数,那么肯定不可能修改一位变成合格的矩阵。否则,就进一步检查
代码如下:
#include<stdio.h>
#include<string.h>
int main()
{
int n,a[101][101],i,j,sum1[101],sum2[101],count,k,l;
while(scanf("%d",&n)==1)
{ if(n==0)
{
break;
}
else
{
count=0;
memset(sum1,0,sizeof(sum1));
memset(sum2,0,sizeof(sum2));
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
sum1[i]=sum1[i]+a[i][j];
}
}
for(j=0;j<n;j++)
{
for(i=0;i<n;i++)
{
sum2[j]=sum2[j]+a[i][j];
}
}
for(i=0;i<n;i++)
{
if(sum1[i]%2==1)
{
k=i;
count++;
}
}
if(count>1)
{
printf("Corrupt\n");
}
else if(count==1)
{
count=0;
for(j=0;j<n;j++)
{
if(sum2[j]%2==1)
{
l=j;
count++;
}
}
if(count>1)
{
printf("Corrupt\n");
continue;
}
else if(count==1)
{
printf("Change bit (%d,%d)\n",k+1,l+1);
}
}
else if(count==0)
{
for(j=0;j<n;j++)
{
if(sum2[j]%2==1)
{
count++;
}
}
if(count==0)
{
printf("OK\n");
}
else
{
printf("Corrupt\n");
}
}
}
}
return 0;;
}