uva 11464 Even Parity 模拟 二进制枚举
来源:互联网 发布:ebay怎么优化listing 编辑:程序博客网 时间:2024/06/05 13:30
链接 http://acm.hust.edu.cn/vjudge/problem/24665
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:
1010The parity of each cell would be
1312111123310100212100000100
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.
题目大意
有一个N×N的矩阵,矩阵中的元素只有1或0,如果说对于一个矩阵,它的所有的点的上下左右的点的和是偶数,则称这个矩阵为偶数矩阵,现在给你一个任意的矩阵,要求的是如果要把这个矩阵变成偶数矩阵的话,最少需要将多少个点由1变成0,若不存在话,输出-1.(N<=15)
解题思路
根据第一行可以枚举出之后的各行,所以用二进制位来模拟比较方便,也可以dfs来枚举
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <queue>#include <vector>#include <cmath>#include <set>#include <map>using namespace std;int a[17][17], b[17][17];int n;const int inf = 1e9;//根据已经枚举好的第一行k,来确定之后几行int check(int s){ memset(b,0,sizeof(b));//b中存枚举的情况 //枚举第一行的各个位,判断是否符合,因为1不能变0 for(int c = 0; c < n; c++) { if(s & (1<<c)) b[0][c] = 1;//第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; //上左右 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(b[r][c] == 0 && a[r][c] == 1) return inf; } // 统计变换次数 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(){ int t; scanf("%d", &t); int k = 1; while(t--) { int i,j; scanf("%d", &n); for(i = 0; i < n; i++) for(j = 0; j < n; j++) scanf("%d", &a[i][j]); //输入矩阵 //枚举各个二进制位 int ans = inf; for(int s = 0; s < (1<<n); s++)//一共2^n种情况 { ans = min(ans, check(s)); } if(ans == inf) ans = -1; printf("Case %d: %d\n", k++, ans); } 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 11464Even Parity
- Uva 11464 - Even Parity
- Uva 11464 - Even Parity
- 国内国外主要搜索引擎网址登录、收录、录入、入口及说明
- FutureTask源码阅读
- PHP5 ,MYSQL数据库操作函数封装类集合
- iOS流布局UICollectionView系列三——使用FlowLayout进行更灵活布局
- PHP4/5用通用检测函数的打包大集合,适合表单,数据库
- uva 11464 Even Parity 模拟 二进制枚举
- 自行制作wordpress的RSS订阅widget
- C语言,自己当年编写的苹果(黑白)棋源程序代码
- [算法]用位运算的方法实现无符号整数的除法原理及程序
- 两款用C语言编写的学生信息成绩管理系统
- nginx php error log 配置 查找500 错误
- [算法]数据结构中关于货郎担路径问题的常用解法,边界路径问题
- iOS/object-c: 枚举类型 enum,NS_ENUM,NS_OPTIONS
- RunTime.exec()如何以root权限执行多条指令?