首页 > 代码库 > UVa11464 Even Parity
UVa11464 Even Parity
很有意思的题目,简单粗暴
根据大白上的思路来的,但是数组下标从1开始会好处理一点
#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <vector>#include <algorithm>using namespace std;const int maxn = 20;const int mod = 1e9+7;const int INF = 0x3f3f3f3f;typedef long long LL;int n,a[maxn][maxn],b[maxn][maxn];int solve(int s){ memset(b,0,sizeof(b)); for(int i = 1;i<=n;++i) { if(s & (1<<(i-1)))b[1][i] = 1; else if(a[1][i]==1)return INF; } for(int i = 1;i<n;++i) for(int j = 1;j<=n;++j) { if(a[i+1][j]) { if((b[i][j-1]+b[i][j+1]+b[i-1][j]+1)%2)return INF; else {b[i+1][j] = 1;continue;} } b[i+1][j] = (b[i][j-1]+b[i][j+1]+b[i-1][j])%2?1:0; } int ans = 0; for(int i = 1;i<=n;++i) for(int j = 1;j<=n;++j) if(a[i][j]!=b[i][j])ans++;// printf("ans = %d\n",ans); return ans;}int main(){// freopen("in.txt","r",stdin);// freopen("out.txt","w",stdout); int T;scanf("%d",&T); for(int kase = 1;kase<=T;++kase) { scanf("%d",&n); for(int i = 1;i<=n;++i) for(int j = 1;j<=n;++j) scanf("%d",&a[i][j]); int ans = INF; for(int i = 0;i<(1<<n);++i) ans = min(ans,solve(i)); if(ans>=INF)ans = -1; printf("Case %d: %d\n",kase,ans); } return 0;}
UVa11464 Even Parity
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。