/*
n*n的01矩阵,把尽量少的 0变1,使得每个元素的上下左右元素的和为偶数。
如果枚举所有的数字的状态,时间复杂度 2^255
如果枚举第一行,整个矩阵的状态就固定了 ,找出满足条件改变 次数最小的值
*/
#include <stdio.h>
#include<cstring>
#include <iostream>
using namespace std;
#define INF 300
#define N 20
int B[N][N],map[N][N];
int min(int x,int y)
{
if(x<y)
return x;
return y;
}
int chack(int s,int n)
{
memset(B,0,sizeof(B));
int i,j;
for(i=0;i<n;i++)
{
if(s & (1<<i))
B[0][i]=1;
else if(map[0][i])
return INF;
}
for(i=1;i<n;i++)
{
for(j=0;j<n;j++)
{
int count=0;
if(i>1)count+=B[i-2][j];
if(j>=1)count+=B[i-1][j-1];
if(j<n-1)count+=B[i-1][j+1];
B[i][j]=count%2;
if(map[i][j] && !B[i][j])
return INF;;
}
}
int count=0;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(map[i][j]!=B[i][j])
count++;
// if((map[i][j]==1 && B[i][j]==0)
// return INF;
}
}
return count;
}
int main()
{
int i,Case,j,t;
int n;
scanf("%d",&t);
for(Case=1;Case<=t;Case++)
{
scanf("%d",&n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&map[i][j]);
int ans=INF;
for(i=0;i<(1<<n);i++)
ans=min(ans,chack(i,n));
printf("Case %d: ",Case);
if(ans==INF)
printf("-1\n");
else
printf("%d\n",ans);
}
//for(;;);
return 0;
}
Uva 11464 - Even Parity
01矩阵偶数和问题
最新推荐文章于 2020-09-26 12:29:30 发布
探讨如何通过最少的0到1转换使n*n的01矩阵中每个元素的相邻元素之和为偶数。文章提供了一种枚举第一行状态以确定整个矩阵状态的方法,并给出实现代码。
2031

被折叠的 条评论
为什么被折叠?



