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.但是 ...
随机推荐
- hibernate hql limit的实现方式
query.setFirstResult(startIndex);//开始索引query.setMaxResults(maxSize);//取几条 如 limit 1,5HQL:query.setFi ...
- java heap space解决方法和JVM参数设置
在JVM中如果98%的时间是用于GC(Garbage Collection)且可用的 Heap size 不足2%的时候将抛出异常信息,java.lang.OutOfMemoryError: Java ...
- k8s 问题
kubelet: Orphaned pod "4db449f0-4eaf-11e8-94ab-90b8d042b91a" found, but volume paths are s ...
- hadoop 官方配置文件解析
比如我的版本是2.8.4 官网文档是: http://hadoop.apache.org/docs/r2.8.4/ 基本配置文件:包括一般的端口 hdfs-default.xml dfs.nameno ...
- 使用Maven部署构件至私服
--------------------siwuxie095 使用 Maven 部署构件至私服 1.部署构件到 Nexu ...
- 使用VisualSVN Server搭建SVN服务器[xyytit]
使用 VisualSVN Server来实现主要的 SVN功能则要比使用原始的 SVN和 Apache相配合来实现源代码的 SVN管理简单的多,上手也没有那么复杂. 下面就看看详细的说明 Visual ...
- 如何在ecplise中配置maven以及ecplise访问本地仓库
1.m2e的插件 因为使用ecplise版本比较高,所以它自带了maven的插件,但是我们希望可以使用我们自己指定的maven.配置步骤如下: ecplise--->preperences下,点 ...
- URL统一资源定位符的组成
URL:Uniform Resource Locator统一资源定位符 用于定位网络上我们需要访问的资源 组成:协议名称+域名+路径+资源的名称.如:https://img13.360img.com/ ...
- phpstorm2018.3的安装和激活和汉化
安装 第一步:解压并打开文件,运行安装程序,点击Next进入下一步, 第二步:选择软件安装目录,自定义选择安装根目录--> 注意!后面还需要找安装目录里的文件,所以记住安装到一个比较容易查看的目 ...
- Tomcat设置默认时区
本文讲解如何在tomcat启动时设置JVM默认时区. 环境:JDK1.8.114 web容器:Tomcat 9 tomcat启动脚本 /etc/init.d/tomcat 操作系统ubuntu 16 ...