UVa 11464 Even Parity (想法题&部分枚举)
2013-09-03 08:05
309 查看
11464 - Even Parity
Time limit: 3.000 secondshttp://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=456&page=show_problem&problem=2459
We have a grid of size N x N. Each cell of the grid initially contains a zero(0) or a one(1).
The parity of a cell is the number of 1s surrounding that cell. A cell is surrounded by at most 4 cells (top, bottom, left, right).
Suppose we have a grid of size 4 x 4:
1 | 0 | 1 | 0 | The parity of each cell would be | 1 | 3 | 1 | 2 |
1 | 1 | 1 | 1 | 2 | 3 | 3 | 1 | |
0 | 1 | 0 | 0 | 2 | 1 | 2 | 1 | |
0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
Input
The first 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. The 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 Output for 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 | Case 1: 0 Case 2: 3 Case 3: -1 |
复杂度:
![](http://img.my.csdn.net/uploads/201309/03/1378166758_6424.png)
完整代码:
/*0.115s*/ #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn = 20; const int INF = 1000000000; int n, A[maxn][maxn], B[maxn][maxn]; int check(int s) { memset(B, 0, sizeof(B)); for (int c = 0; c < n; c++) { if (s & (1 << c)) B[0][c] = 1; else if (A[0][c] == 1) return INF; // 1不能变成0 } for (int r = 1; r < n; r++) for (int c = 0; c < n; c++) { int sum = 0; // 元素B[r-1][c]的上、左、右3个元素之和 if (r > 1) sum += B[r - 2][c]; if (c > 0) sum += B[r - 1][c - 1]; if (c < n - 1) sum += B[r - 1][c + 1]; B[r][c] = sum % 2; if (A[r][c] == 1 && B[r][c] == 0) return INF; // 1不能变成0 } int cnt = 0; for (int r = 0; r < n; r++) for (int c = 0; c < n; c++) if (A[r][c] != B[r][c]) cnt++; return cnt; } int main(void) { int T; scanf("%d", &T); for (int kase = 1; kase <= T; kase++) { scanf("%d", &n); for (int r = 0; r < n; r++) for (int c = 0; c < n; c++) scanf("%d", &A[r][c]); int ans = INF;///设置成无穷大 for (int s = 0; s < (1 << n); s++) ans = min(ans, check(s)); if (ans == INF) ans = -1; printf("Case %d: %d\n", kase, ans); } return 0; }
相关文章推荐
- uva - 11464 - Even Parity(部分枚举,递推)
- UVA 11464 Even Parity(部分枚举 递推)
- 例题1.7 偶数矩阵 Even Parity UVA - 11464 部分枚举+递推
- UVA 11464 - Even Parity(枚举方法)
- UVA 11464 Even Parity(暴力枚举)
- UVA - 11464 Even Parity 01矩阵——枚举
- uva 11464 - Even Parity (枚举+递推)
- UVA - 11464 Even Parity 01矩阵——枚举
- 状态压缩+枚举 UVA 11464 Even Parity
- POJ 1903 & ZOJ 2469 & UVA 1326 Jurassic Remains (部分枚举)
- UVA - 11464 Even Parity 枚举
- UVa 11464 Even Parity(枚举)
- UVa 11464 - Even Parity(枚举)
- UVA11464 Even Parity (局部枚举定全局枚举)
- 【UVA】11464-Even Parity(二进制枚举子集)
- UVA 11464 Even Parity(递归枚举)
- UVA 11464 Even Parity(枚举递推)
- UVA 11464 Even Parity(枚举)
- uva 11464 Even Parity 模拟 二进制枚举
- UVA 11464 - Even Parity(枚举方法)