描述
给定n*n由0和1组成的矩阵,如果矩阵的每一行和每一列的1的数量都是偶数,则认为符合条件。
你的任务就是检测矩阵是否符合条件,或者在仅改变一个矩阵元素的情况下能否符合条件。
"改变矩阵元素"的操作定义为0变成1或者1变成0。
输入
输入n + 1行,第1行为矩阵的大小n(0 < n < 100),以下n行为矩阵的每一行的元素,元素之间以一个空格分开。
输出
如果矩阵符合条件,则输出OK;
如果矩阵仅改变一个矩阵元素就能符合条件,则输出需要改变的元素所在的行号和列号,以一个空格分开。
如果不符合以上两条,输出Corrupt。
样例输入
样例输入1 4 1 0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 样例输入2 4 1 0 1 0 0 0 1 0 1 1 1 1 0 1 0 1 样例输入3 4 1 0 1 0 0 1 1 0 1 1 1 1 0 1 0 1
样例输出
样例输出1 OK 样例输出2 2 3 样例输出3 Corrupt
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
int r[102]={0},c[102]={0};
int row=0,cow=0;
int arr[102][102]={0};
int compare(int n) //用来判断矩阵的每一行和每一列的1的数量都是否是偶数
{
int i,j;
for (i=0;i<n;i++)
{
row=0;
cow=0;
for (j=0;j<n;j++)
{
if (arr[i][j]==1)
row+=arr[i][j];
if (arr[j][i]==1)
cow+=arr[j][i];
}
if (row%2!=0||cow%2!=0)
{
return -1;
}
}
return 1;
} //这种方式判断比较好想,但是做了很多重复的判断,效率不高
int main()
{
int n;
int h,k;
scanf("%d",&n);
int flag=1,flag1=-1;//flag用于判断是否初始矩阵是否合格
for (h=0;h<n;h++)
{
for (k=0;k<n;k++)
{
scanf("%d",&arr[h][k]);
}
}
if (flag=compare(n)==-1)
{
for (h=0;h<n;h++)
{
for (k=0;k<n;k++)
{
flag1=-1; //flag1用于判断是否改变数值后矩阵是否合格
arr[h][k]=1-arr[h][k];//"改变矩阵元素"0变成1或者1变成0
flag1=compare(n);
if (flag1==1)//合格的话就输出行和列
{
printf("%d %d",h+1,k+1);
return 0;
}
arr[h][k]=1-arr[h][k]; //不合格的话将变化的元素变回去
}
}
if (flag1==-1)//每个数据都测试之后,如果没有符合条件的输出Corrupt
{
printf("Corrupt");
return 0;
}
}
else if (flag=compare(n)==1)
printf("OK");
return 0;
}
这里有一点我不是很明白:(有哪位大佬给解释一下不,蟹蟹)
flag1=compare(n);
if (flag1==1)
{
printf("%d %d",h+1,k+1);
return 0;
}
//这样做的话是AC,10分
然而
if (flag1=compare(n)==1)
{
printf("%d %d",h+1,k+1);
return 0;
}
//这就是6分