【枚举暴力】【UVA11464】 Even Parity
Description
给你一个0/1矩阵,可以将矩阵中的0变成1,问最少经过多少此操作使得矩阵任意一元素四周的元素和为偶数。
Input
第一行是一个整数T代表数据组数,每组数据包含以下内容:
- 第一行是一个整数n,代表矩阵的行列数
- 接下来n行每行n个用空格隔开的整数,代表矩阵元素。
Output
对于每组数据输出一行,格式为Case X: ans
Sample Input
Sample Output
Case :
Case :
Case : -
Hint
1≤n≤15,数据不超过30组。
Solution
考虑爆搜,显然超时。
考虑如果我们知道了前i行的信息,为了保证第i行是合法的,那么第i+1行放什么元素就被唯一确定了。
换句话说,只要确定了第一行的元素,通过数学归纳法易证,整个矩阵都被唯一确定了。
考虑第一行,只有2n种可能,由于n≤15,完全可以进行枚举。后面依据前面的元素进行判断,复杂度为O(n2),合并复杂度上届为O(2nn2),已经可以通过本题。
通过一些简单的剪纸,程序可以跑的飞快,40ms在lg rk1。
Code
#include<cstdio>
#include<cstring>
#define rg register
#define ci const int inline void qr(int &x) {
char ch=getchar(),lst=NULL;
while(ch>''||ch<'') lst=ch,ch=getchar();
while(ch>=''&&ch<='') x=(x<<)+(x<<)+(ch^),ch=getchar();
if (lst=='-') x=-x;
} char buf[];
inline void write(int x,const char aft,const bool pt) {
if(x<) {putchar('-');x=-x;}
int top=;
do {
buf[++top]=x%+'';
x/=;
} while(x);
while(top) putchar(buf[top--]);
if(pt) putchar(aft);
} template <typename T>
inline T mmax(const T &a,const T &b) {if(a>b) return a;return b;}
template <typename T>
inline T mmin(const T &a,const T &b) {if(a<b) return a;return b;}
template <typename T>
inline T mabs(const T &a) {if(a<) return -a;return a;} template <typename T>
inline void mswap(T &a,T &b) {T temp=a;a=b;b=temp;} const int maxn = ;
const int INF = 0x3f3f3f3f; int t,n,cnt,ans;
int MU[maxn][maxn];
int pos[maxn][maxn]; void clear();
void dfs(ci,ci);
void check(ci); int main() {
qr(t);
while(t--) {
clear();qr(n);
for(rg int i=;i<=n;++i) for(int j=;j<=n;++j) qr(MU[i][j]);
dfs(,);
if(ans==INF) ans=-;
printf("Case %d: %d\n",++cnt,ans);
}
return ;
} void clear() {
memset(MU,,sizeof MU);
memset(pos,,sizeof pos);
n=;ans=INF;
} void dfs(ci k,ci x) {
if(x>=ans) return;
if(k>n) {check(x);return;}
if(!MU[][k]) {
pos[][k]=;dfs(k+,x);
pos[][k]=;dfs(k+,x+);
}
else {
pos[][k]=;dfs(k+,x);
}
} void check(int x) {
for(rg int i=;i<=n;++i) {
rg int di=i-;rg int ddi=di-;
for(rg int j=;j<=n;++j) {
if((pos[di][j-]+pos[di][j+]+pos[ddi][j])&) pos[i][j]=;else pos[i][j]=;
if(pos[i][j]!=MU[i][j]) {
if(MU[i][j]) return;
++x;
if(x>=ans) return;
}
}
}
for(rg int i=;i<=n;++i) {
if((pos[n][i-]+pos[n][i+]+pos[n-][i])&) return;
}
ans=x;
}
Summary
在答案依附于一个初始状态,且初始状态数可以枚举时,不妨考虑枚举初始状态,凭借此计算出终态。
这样做不仅应用于搜索题,事实上也应用于一部分DP中。
【枚举暴力】【UVA11464】 Even Parity的更多相关文章
- Tomb Raider HihoCoder - 1829 (二进制枚举+暴力)(The 2018 ACM-ICPC Asia Beijing First Round Online Contest)
Lara Croft, the fiercely independent daughter of a missing adventurer, must push herself beyond her ...
- HDU 3484 Matrix Game 枚举暴力
上次周赛碰到这个题目,居然都没思路,真是不应该啊,起码也应该想到枚举法. 因为题目只允许每一row进行reverse操作,而每两列可以进行交换操作,所以首先把row的变化固定下来,即枚举第一列与第1- ...
- [UVA11464]Even Parity(状压,枚举)
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- POJ - 3279(枚举+暴力)
Fliptile Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 14297 Accepted: 5257 Descrip ...
- 状态压缩+枚举 UVA 11464 Even Parity
题目传送门 /* 题意:求最少改变多少个0成1,使得每一个元素四周的和为偶数 状态压缩+枚举:枚举第一行的所有可能(1<<n),下一行完全能够由上一行递推出来,b数组保存该位置需要填什么 ...
- 【codeforces1058】Vasya and Golden Ticket 枚举+暴力+模拟
#点击传送 题目描述 Recently Vasya found a golden ticket - a sequence which consists of nn digits a1a2-ana1a2 ...
- Uva11464 Even Parity
枚举每个格子的状态显然是不可能的. 思考发现,矩阵第一行的状态确定以后,下面的状态都可以递推出来. 于是状压枚举第一行的状态,递推全图的状态并判定是否可行. /*by SilverN*/ #inclu ...
- USACO环绕岛屿Surround the Islands 并查集 枚举暴力
题目描述 Farmer John has bought property in the Caribbean and is going to try to raise dairy cows on a b ...
- UVA11464 Even Parity 搜索+递推
问题描述 UVA11464 题解 第一直觉爆搜. 发现 \(N \le 15\) ,然后后面每行都可以通过第一行递推出来. 爆搜第一行,递推后面+check \(\mathrm{Code}\) #in ...
随机推荐
- 推荐:一个适合于Python新手的入门练手项目
随着人工智能的兴起,国内掀起了一股Python学习热潮,入门级编程语言,大多选择Python,有经验的程序员,也开始学习Python,正所谓是人生苦短,我用Python 有个Python入门练手项目, ...
- commons-lang源码解析之StringUtils
apache的commons工具包是平时使用最多的工具包之一,对其实现方式需要具体了解.commons-lang version 3.1 empty和blank的区别 StringUtils中判断St ...
- Open MPI集群运行
部署完之后,代码也能正确跑起来了,也确实集群分散了.跑一下各种各样的代码,发现了一个错误: $ ~/OpenMpi/bin/mpiexec -np ~/NetWorkTest My rank is M ...
- Halcon图像采集助手提示找不到指定DLL文件
问题原因: Halcon软件更新导致某些图像采集DLL失效,这个时候就需要去MVTEC官网下载图像采集接口补丁程序,MVTEC官网地址http://www.mvtec.com/. 对于其他模块失效的D ...
- NMAP-服务扫描
1.版本探测 2.扫描强度 共分1-9级,默认是7级,等级越高强度越高 同-sV一同使用 3.轻量扫描 等价于–version-intensity 2 4重量扫描 等价于–version-intens ...
- JS中通过数组的方式操作字符串 数组是个好东西 ....
题目:使用JS将 var str="what are you nong sha lei",通过您的方法转换为"What Are You Nong Sha Lei" ...
- PSP1123
PSP时间图: 类型 任务 开始时间 结束时间 净时间 中断时间 日期 开会 开会 16:17 16:50 33 0 20171027 开会 开会 17:00 17:22 22 0 20171028 ...
- 20172330 2017-2018-1 《Java程序设计》第九周学习总结
20172330 2017-2018-1 <程序设计与数据结构>第九周学习总结 教材学习内容总结 本周的学习包括两章内容,分别为异常和递归. 异常 错误和异常都是对象,代表非正常情况或者无 ...
- 分页查询es时,返回的数据不是自己所期望的问题
在进行es分页查询时,一般都是用sql语句转成es查询字符串,在项目中遇到过不少次返回的数据不是自己所期望的那样时,多半原因是自己的sql拼接的有问题. 解决办法:务必要保证自己的sql语句拼接正确.
- linux系统中如何进入退出vim编辑器的方法及区别
在linux家族中,vim编辑器是系统自带的文本编辑器,其功能强大自不必说了. 偶有小白,刚接触linux,要修改某个文本文件,不可能像WINDOWS那样操作,更有甚者,进入VI编辑器后,无法退出以致 ...