UVa 11464 Even Parity (二进制法枚举)
题意:给你一个n*n的01矩阵,让你把最少的0变成1,使得每个元素的上,下,左,右的元素(如果有的话)之和均为偶数。
析:最好想的的办法就是暴力,就是枚举每个数字是变还是不变,但是。。。时间复杂度也太高了吧,2的225次方哪,
绝对超64位了,跑到猴年马月才到结束,很明显不现实。仔细想一下,n=15,是最大了,如果枚举第一行,还是可以的,
所以第一行是可以枚举的,再想一下,通过第一行,是不是可以把二行也给确定出来,是的,可以,想一下,比如第一行的,
我们确定好了,那么第一行的上下左右必须是偶数,所以我们就可以确定第二行了(想一想,是不是,画个表看一下)。
那么由二行也就推出第三行了。等等,最后取最小的即可,注意的是如果是1,是不能改的,特判一下。用的是二进制法。
代码如下:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath> using namespace std;
const int maxn = 15 + 5;
const int INF = 0x3f3f3f3f;
int a[maxn][maxn], b[maxn][maxn], n; int solve(int s){
memset(b, 0, sizeof(b));//要记得清空数组
for(int i = 0; i < n; ++i){
if(s & (1<<i)) b[0][i] = 1;
else if(1 == a[0][i]) return INF;//是1,本应该是0的,不能修改,结束
} for(int r = 0; r < n-1; ++r)
for(int c = 0; c < n; ++c){
int sum = 0;
if(r > 0) sum += b[r-1][c];//计算上下左右
// if(r < n-1) sum += b[r+1][c];
if(c > 0) sum += b[r][c-1];
if(c < n-1) sum += b[r][c+1];
b[r+1][c] = sum % 2;//确定下一行元素
if(a[r+1][c] && !b[r+1][c]) 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(){
// freopen("in.txt", "r", stdin);
int T; cin >> T;
for(int kase = 1; kase <= T; ++kase){
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, solve(i)); printf("Case %d: %d\n", kase, ans == INF ? -1 : ans);
}
return 0;
}
UVa 11464 Even Parity (二进制法枚举)的更多相关文章
- UVA 11464 Even Parity(递归枚举)
11464 - Even Parity Time limit: 3.000 seconds We have a grid of size N x N. Each cell of the grid in ...
- UVA 11464 Even Parity(部分枚举 递推)
Even Parity We have a grid of size N x N. Each cell of the grid initially contains a zero(0) or a on ...
- UVA - 11464 Even Parity 【暴力枚举】
题意 给出一个 01 二维方阵 可以将里面的 0 改成1 但是 不能够 将 1 改成 0 然后这个方阵 会对应另外一个 方阵 另外一个方阵当中的元素 为 上 下 左 右 四个元素(如果存在)的和 要求 ...
- 状态压缩+枚举 UVA 11464 Even Parity
题目传送门 /* 题意:求最少改变多少个0成1,使得每一个元素四周的和为偶数 状态压缩+枚举:枚举第一行的所有可能(1<<n),下一行完全能够由上一行递推出来,b数组保存该位置需要填什么 ...
- UVA.11464 Even Parity (思维题 开关问题)
UVA.11464 Even Parity (思维题 开关问题) 题目大意 给出一个n*n的01方格,现在要求将其中的一些0转换为1,使得每个方格的上下左右格子的数字和为偶数(如果存在的话),求使得最 ...
- UVA - 818 Cutting Chains(切断圆环链)(dfs + 二进制法枚举子集)
题意:有n个圆环(n<=15),已知已经扣在一起的圆环,现在需要打开尽量少的圆环,使所有圆环可以组成一条链. 分析:因为不知道要打开哪个环,如果列举所有的可能性,即枚举打开环的所有子集,最多才2 ...
- UVA 11464 - Even Parity(枚举方法)
D Even Parity Input: Standard Input Output: Standard Output We have a grid of size N x N. Each cell ...
- 【转载】UVa 11464 Even Parity 偶数矩阵
题意:给你一个n*n的01矩阵,让你把这个矩阵中尽量少的0转换成1,使得矩阵每个位置的上下左右四个相邻的数加起来能被2整除,求最少的转换数 首先,n 的规模并不大,最大只有15.但是完全枚举整个矩阵显 ...
- UVa 11464 Even Parity 偶数矩阵
给你一个 n * n 的 01 矩阵,现在你的任务是将这个矩阵中尽量少的 0 转化为 1 ,使得每个数的上下左右四个相邻的数加起来是偶数.求最少的转化个数. 首先,n 的规模并不大,最大只有15.但是 ...
随机推荐
- python判断unicode是否是汉字,数字,英文,或者其他字符
下面这个小工具包含了 判断unicode是否是汉字,数字,英文,或者其他字符. 全角符号转半角符号. unicode字符串归一化等工作. 还有一个能处理多音字的汉字转拼音的程序,还在整理中. #!/u ...
- Hibernate 的update语句性能详解
Hibernate 中如果直接使用 Session.update(Object o); 会把这个表中的所有字段更新一遍. 比如: view plaincopy to clipboardprint? p ...
- 尴尬!Jsp内置对象
今天挺尴尬的,上网络安全课做错了ppt ,尴尬到头皮发麻. JSP内置对象 JSP内置对象是Web容器创建的一组对象,不使用new关就可以使用的内置对象. <%int[ ]value= {60, ...
- MongoDB 集合命令
集合命令 创建语法如下 name是要创建的集合的名称 options是一个文档,用于指定集合的配置,选项参数是可选的,所以只需要到指定的集合名称 可以不手动创建集合,向不存在的集合中第一次加入数据 ...
- python格式化输出(转)
在许多编程语言中都包含有格式化字符串的功能,比如C和Fortran语言中的格式化输入输出.Python中内置有对字符串进行格式化的操作%. 模板 格式化字符串时,Python使用一个字符串作为模板.模 ...
- sam/bam格式
1)Sam (Sequence Alignment/Map) ------------------------------------------------- 1) SAM 文件产生背景 随着Ill ...
- 第六章 图(c)广度优先搜索
- MyBatis一对一查询
---------------------siwuxie095 MyBatis 一对一查询 以订单和用户为例,即 相对订 ...
- 数字三角形 · Triangle
从上到下用DP. [抄题]: 给定一个数字三角形,找到从顶部到底部的最小路径和.每一步可以移动到下面一行的相邻数字上. 比如,给出下列数字三角形: [ [2], [3,4], [6,5,7], [4, ...
- VS 窗体大小
锁定窗体大小,就是鼠标停在窗口边框的时候,不能拖动来改变它的大小…… 有两种方法: 1.可以把Form的属性 FormborderStyle 后面选择 FixedDialog 2.或者把Form窗体的 ...