题目链接:http://poj.org/problem?id=2260
--------------------------------------------------------
题意:一种校验码,查出一位的比特差错。
思路:校验码的原理与思路很明确,计算出每行每列的和,找出该和为奇数的点,该点所对应的x,y坐标即为所求。超过两位输出"Corrupt"。
代码:
#include<cstdio> #include<iostream> using namespace std; int N=0; int main(void){ while(scanf("%d",&N)){ if(N==0) break; const int n =N; int a[n][n]; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ scanf("%d",&a[i][j]); // printf("%d",a[i][j]); } } int L[n]; int H[n]; for(int i=0;i<n;i++){ int suml = 0; for(int j=0;j<n;j++){ suml+=a[i][j]; } L[i] = suml; //printf("%d",L[i]); } for(int i=0;i<n;i++){ int sumh=0; for(int j=0;j<n;j++){ sumh +=a[j][i]; } H[i] =sumh; //printf("%d",H[i]); } int Lf =-1; int Hf =-1; int cl=0; int ch=0; for(int i=0;i<n;i++){ if(L[i]%2==1){ Lf =i; cl++; } if(H[i]%2==1){ Hf =i; ch++; } } if(cl>1||ch>1){ printf("Corrupt\n"); }else if(Lf==-1&&Hf==-1){ printf("OK\n"); }else{ printf("Change bit (%d,%d)\n",Lf+1,Hf+1); } } return 0; }