【枚举暴力】【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 ...
随机推荐
- WEB网站测试心得整理
一.输入框: 1.正常的字母/文字/数字(正常流程的测试): 2.重复提交(输入内容后,重复点击提交按钮): 3.纯异常字符/正常输入夹杂异常字符(!@#¥%……&**等等): 4.长度限制( ...
- 接口文档神器--apiui的使用
接口开发,最麻烦的就是写文档了,曾经我也因为写接口文档苦不堪言:自从使用了apiui接口文档神器,工作效率和文档清晰得到了不止一个档次的提升. 下面介绍一下这个神器的使用: 把文件下载下来,放在网站根 ...
- hexo部署失败如何解决
- Office 365 E3功能
本文简要总结了Office 365E3的功能
- 从零开始的Python学习Episode 6——字符串操作
字符串操作 一.输出重复字符串 print('smile'*6) #输出6个smile 二.通过引索输出部分字符串 print('smile'[1:]) print('smile'[1:3]) #输出 ...
- 【算法分析】如何理解快慢指针?判断linked list中是否有环、找到环的起始节点位置。以Leetcode 141. Linked List Cycle, 142. Linked List Cycle II 为例Python实现
引入 快慢指针经常用于链表(linked list)中环(Cycle)相关的问题.LeetCode中对应题目分别是: 141. Linked List Cycle 判断linked list中是否有环 ...
- Python3 Tkinter-Label
1.创建 from tkinter import * root=Tk() root.title('Hello tkinter!') root.mainloop() 2.使用内置位图 from tkin ...
- lintcode-158-两个字符串是变位词
158-两个字符串是变位词 写出一个函数 anagram(s, t) 判断两个字符串是否可以通过改变字母的顺序变成一样的字符串. 说明 What is Anagram? Two strings are ...
- React & `event.persist()`
React & event.persist() event.persist() https://reactjs.org/docs/events.html#event-pooling Tabs ...
- keyboard shortcuts & Xcode 10
keyboard shortcuts & Xcode 10 Xcode Keyboard Shortcuts https://swifteducation.github.io/assets/p ...