UV-11464-Even Parity
11464 Even Parity
We have a grid of size N × N. Each cell of the grid initially contains a zero (0) or a one (1). The parity
Of a cell is the number of 1 s surrounding that cell. A cell is surrounded by at most 4 cells (top, bottom,
Left, right ).
Suppose we have a grid of size 4 × 4:
1 0 1 0 The parity of each cell wocould be 1 3 1 2
1 1 1 1 2 3 2 1
0 1 0 0 2 1 2 1
0 0 0 0 1 0 0
For this problem, you have to change some of the 0 s to 1 s so that the parity of every cell becomes
Even. We are interested in the minimum number of transformations of 0 to 1 that is needed to achieve
The desired requirement.
Input
The? Rst line of input is an integer T (T <30) that indicates the number of test cases. Each case starts
With a positive integer N (1 ≤ N ≤ 15). Each of the next N lines contain N integers (0/1) each.
Integers are separated by a single space character.
Output
For each case, output the case number followed by the minimum number of transformations required.
If it's impossible to achieve the desired result, then output '-1' instead.
Sample Input
3
3
0 0 0
0 0 0
0 0 0
3
0 0 0
1 0 0
0 0 0
3
1 1 1
1 1 1
0 0 0
Sample Output
Case 1: 0
Case 2: 3
Case 3:-1
AC code:
# Include
# Include
# Include # define INF 0x7fffffusing namespace std; const int maxn = 20; int n, a [maxn] [maxn], B [maxn] [maxn]; int check (int x) {memset (B, 0, sizeof (B); for (int I = 0; I <n; I ++) {if (x & (1 <I )) B [0] [I] = 1; else if (a [0] [I] = 1) return INF; // conflict} for (int I = 1; I <n; I ++) {for (int j = 0; j <n; j ++) {int sum = 0; if (I> 1) sum + = B [I-2] [j]; if (j> 0) sum + = B [I-1] [J-1]; if (j <n-1) sum + = B [I-1] [j + 1] ; B [I] [j] = sum % 2; if (a [I] [j] = 1 & B [I] [j] = 0) return INF ;}} int cnt = 0; for (int I = 0; I <n; I ++) {for (int j = 0; j <n; j ++) {if (a [I] [j]! = B [I] [j]) cnt ++;} return cnt ;}int main () {int T; scanf ("% d", & T ); for (int cas = 1; cas <= T; cas ++) {scanf ("% d", & n); for (int I = 0; I <n; I ++) {for (int j = 0; j <n; j ++) {scanf ("% d", & a [I] [j]);} int ans = INF; for (int I = 0; I <(1 <n); I ++) {ans = min (ans, check (I ));} if (ans = INF) ans =-1; printf ("Case % d: % d \ n", cas, ans);} return 0 ;}