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.但是 ...
随机推荐
- android -chrome 调试
在chrome上 输入 chrome://inspect/ 连接手机,配置 监听8000,和8080端口 cordova默认是8000端口 如果出现白屏:原因:google在首次加载时,要进行服务器连 ...
- eclipse使用ctrl+shift+F格式化代码失效
通常情况出现这种问题是组合快捷键和别的软件快捷键冲突了, 最常见的是和搜狗输入法冲突, 在设置中找到搜狗输入法然后把冲突的快捷键取消掉就可以了.
- Mybatis知识(5)
1. #{} 与${}的区别 #{}解释为 JDBC prepared statement 的一个参数标记,而${}解释为字符串替换.比如:我们不能在表名的位置使用参数标记,也不能在列名的位置使用参数 ...
- map模块使用方法
map指令使用ngx_http_map_module模块提供的.默认情况下,nginx有加载这个模块,除非人为的 --without-http_map_module.ngx_http_map_modu ...
- 在Eclipes中查看源代码和大纲快速定位
1 在Eclipes中查看源代码,快捷键使用clrl+光标,选择你要查看的方法和属性查看源代码.例如你想看StringBuilder这个类源代码 StringBuilder allow = new S ...
- 页面中 json 格式显示 数据
在页面中,有时候我们需要的不仅仅是将数据显示出来,而且要以以 json 的格式显示数据,如显示接口的时候 我们需要如下显示 这个时候,主要用到了 <pre> 标签 $.get(" ...
- 微擎系统 微信支付 get_brand_wcpay_request:fail
支付授权目录问题,有一个是域名加app的
- Mysql 内部默认排序
mysql默认的排序: https://forums.mysql.com/read.php?21,239471,239688#msg-239688 Do not depend on order whe ...
- 格式化java8 LocalDateTime
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss", Locale.CHINA).format(time1);
- iperf——网络性能测试工具
一.前言 工作中遇到需要测试Linux服务器网卡占用率的场景,查阅资料后,发现iperf是一款合适的网络测速工具. 下面讲解一下如何使用iperf做网络性能测试. 二.基础知识 先补充一些基础知识: ...