才符合property。
若存在唯一奇數,
使row跟column因為這個數被改變就能變偶數,
就改變他。
超過一個奇數就不用處理。
好像就直接做嘛……我也不知道我在寫啥。
第一次用(*)[]的寫法來接收二維陣列,效果不錯。
/* ACM 541
* mythnc
* 2011/10/22 20:33:45
* run time: 0.008
*/
#include <stdio.h>
#define MAX 99
#define ONE 1
#define MORE 0
void property(int (*)[MAX], int);
int oddnumber(int *, int *, int);
int main(void)
{
int n, i, j;
int ary[MAX][MAX];
while (scanf("%d", &n) == 1) {
if (n == 0)
return 0;
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
scanf("%d", &ary[i][j]);
property(ary, n);
}
}
/* property: find the matrix has partity property or not */
void property(int (*pt)[MAX], int n)
{
/* sum[0]: sum of each row, sum[1]: sum of each column */
/* record[0]: bit row, sum[1]: bit column */
int i, j, sum[2], record[2];
for (record[0] = record[1] = i = 0 ; i < n; i++) {
for (sum[0] = sum[1] = j = 0; j < n; j++) {
sum[0] += pt[i][j]; /* sum of each row */
sum[1] += pt[j][i]; /* sum of each column */
}
/* judge row and column*/
for (j = 0; j < 2; j++)
if (oddnumber(&sum[j], &record[j], i) == MORE) {
printf("Corrupt\n");
return;
}
}
if (record[0] == 0 && record[1] == 0)
printf("OK\n");
else
printf("Change bit (%d,%d)\n", record[0], record[1]);
}
/* oddnumber: calculate the odd number,
* record it's row and column
* if no odd or only 1 odd return ONE
* if more then 1 odd return MORE
*/
int oddnumber(int *sum, int *record, int i)
{
if (*sum % 2 == 1 && *record == 0)
*record = i + 1;
else if (*sum % 2 == 1 && *record > 0)
return MORE;
return ONE;
}
沒有留言:
張貼留言