/*======================================================================== 错误探测 总时间限制: 1000ms 内存限制: 65536kB 描述 给出由0和1组成的矩阵,如果矩阵的每一行和每一列的1的数量都是偶数,则认为符合条件。 你的任务就是检测矩阵是否符合条件,或者在仅改变一个矩阵元素的情况下能否符合条件。 "改变矩阵元素"的操作定义为0变成1,1变成0。 输入 包含多个测试数据。每个测试数据有多行,第一行为矩阵的大小n(n < 100),以下n行为矩阵的值。 输入以0结束。 输出 如果矩阵符合条件,则输出OK 如果矩阵仅改变一个矩阵元素就能符合条件,则输出Change bit (x,y),其中x和y为该元素的坐标 如果不符合以上两条,输出Corrupt 样例输入 4 1 0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 4 1 0 1 0 0 0 1 0 1 1 1 1 0 1 0 1 4 1 0 1 0 0 1 1 0 1 1 1 1 0 1 0 1 0 样例输出 OK Change bit (2,3) Corrupt 分析: 输入数组时不需存储数组的数据; 输入时同时计算并用两个一维数组存储每一行、每一列的和 ; 注意求和前要对两个一维数组清零; 统计奇数个1的行和奇数个1的列 的数量rowN和colN; 假如rowN==colN==1说明有且仅有一行和一列含有奇数个1 (这个情况只需要把该行和该列交叉处的值改变一下即可,所以结果就是Change bit (2,3)) 假如 rowN==colN==0,则是OK 假如是其他情况则是Corrupt 注意:输出案例Change bit (2,3)在左括号'(' 前是有一个空格的。少了这个空格, 提交时格式错误的。 另外:分析一下输入输出案例第二组数据发现,题目默认数组的下标从1开始。 ==========================================================================*/
#include<stdio.h> int main() { int n,i,j,t; int rowSum[100],colSum[100];//分别存储每一行、每一列的和 int rowN,colN;//存储有奇数个1的行数、列数 int x,y; freopen("6.in","r",stdin); freopen("result.out","w",stdout); scanf("%d",&n); while(n!=0) { for(i=0;i<100;i++)//清空求和数组 { rowSum[i]=0; colSum[i]=0; } //输入的同时计算每一行每一列的和 for(i=0;i<n;i++) { for(j=0;j<n;j++) { scanf("%d",&t); rowSum[i]=rowSum[i]+t; colSum[j]=colSum[j]+t; } } rowN=0; colN=0; for(i=0;i<n;i++)//检测奇数个1的行、奇数个1的列 { if(rowSum[i]&1) { rowN++; x=i; } if(colSum[i]&1) { colN++; y=i; } } //判断结果 if(rowN==1&&colN==1) { printf("Change bit (%d,%d)\n",x+1,y+1); } else if(rowN==0&&colN==0) { printf("OK\n"); } else printf("Corrupt\n"); //输入下一组的阶数 scanf("%d",&n); } return 0; }