UVA 11464 - Even Parity(枚举方法)
来源:互联网 发布:制作软件的软件手机版 编辑:程序博客网 时间:2024/06/05 18:04
D
Even Parity
Input: Standard Input
Output: Standard Output
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
For this problem, you have to change some of the 0s to 1s 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 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
题意:给定n*n矩阵,可以把0变成1,求最少变幻次数使得每个位置的上下左右之和为偶数。
思路:n为15,第一行状态最多2^15种,然后由前一行可以推出后一行,如此一来,时间复杂度为O(2^n) * (n^2).
代码:
#include <stdio.h>#include <string.h>#define min(a,b) (a)<(b)?(a):(b)#define INF 0x3f3f3f3fconst int d[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};const int N = 15;int t, n, map[N][N], save[N][N];void init() { scanf("%d", &n); for (int i = 0; i < n; i ++)for (int j = 0; j < n; j ++) { scanf("%d", &map[i][j]);}}int Sum(int i, int j) { int sum = 0; for (int k = 0; k < 4; k ++) {int xx = i + d[k][0];int yy = j + d[k][1];if (xx >= 0 && xx < n && yy >= 0 && yy < n) { sum += save[xx][yy]; } } return sum;}int cal(int state) { int count = 0; memset(save, 0, sizeof(save)); for (int i = 0; i < n; i ++)for (int j = 0; j < n; j ++) save[i][j] = map[i][j]; for (int i = n - 1; i >= 0; i --)if (state >= (1<<i)) { if (!save[0][n - 1 - i])count ++; save[0][n - 1 - i] = 1; state -= (1<<i);} for (int i = 0; i < n - 1; i ++) {for (int j = 0; j < n; j ++) { if (Sum(i, j) % 2) {if (save[i + 1][j]) return count = INF;save[i + 1][j] = 1;count ++; }} } for (int j = 0; j < n; j ++)if (Sum(n - 1, j) % 2) { count = INF; break;} return count;}int judge(int state) { for (int i = 0; i < n; i ++)if (map[0][i] == 1 && (state&(1<<i) == 0)) return false; return true;}void solve() { int m = 1<<n, ans = INF; for (int i = 0; i < m; i ++) {if (judge(i)) { ans = min(ans, cal(i));} } if (ans == INF)printf("-1\n"); elseprintf("%d\n", ans);}int main() { int cas = 0; scanf("%d", &t); while (t--) {init();printf("Case %d: ", ++cas);solve(); } return 0;}
- UVA 11464 - 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(枚举)
- uva - 11464 - 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 模拟 二进制枚举
- UVA 11464 Even Parity(暴力枚举)
- UVA 11464 - Even Parity
- uva 11464 - Even Parity
- Uva-11464-Even Parity
- java 实现扫雷算法
- android开发环境搭建最新方法
- 有效用户ID 实际用户ID
- DB2系统编目
- Builder模式的几个要点
- UVA 11464 - Even Parity(枚举方法)
- 深入浅出INNODB MVCC机制与原理
- C# 判断SQL Server表存在
- 关于配置伪分布hadoop无法启动datanode的解决
- NandFlash驱动超详细分析
- mgo的小技巧
- stat函数讲解
- MYSQL 官方参考手册
- 手把手教你iOS消息推送证书生成以及Push消息