0
点赞
收藏
分享

微信扫一扫

UVA - 11464 Even Parity 枚举


题目大意:给出一个n*n的01矩阵,你的任务是把尽量少的0变成1,使得每个元素的上下左右的元素之和均为偶数

解题思路:枚举第一行的所有状态,再进行统计

#include<cstdio>
#include<cstring>

#include<algorithm>
using namespace std;
#define INF 0x3f3f3f3f
#define maxn 25
int begin[maxn][maxn], end[maxn][maxn];
int N;
int count(int S) {
	memset(end,0,sizeof(end));
	for(int i = 0; i < N; i++)
		if(S & (1 << i))
			end[0][i] = 1;
		else if(end[0][i] == 0 && begin[0][i] == 1)
			return INF;
			
	for(int row = 1; row < N; row++)
		for(int col = 0; col < N; col++) {
			int sum = 0;
			if(row > 1) sum += end[row-2][col];
			if(col >= 1) sum += end[row-1][col-1];
			if(col < N -1) sum += end[row-1][col+1];
			end[row][col] = sum % 2;	
			if(begin[row][col] == 1 && end[row][col] == 0)
				return INF;
		}
	int cnt = 0;
	for(int row = 0; row < N; row++)
		for(int col = 0; col < N; col++)
			if(begin[row][col] != end[row][col])
				cnt++;
	return cnt;
}

int main() {
	int test, mark = 1;
	scanf("%d",&test);
	while(test--) {
		scanf("%d",&N);
		for(int i = 0; i < N; i++)
			for(int j = 0; j < N; j++)
				scanf("%d",&begin[i][j]);
		int MIN =  INF;
		for(int i = 0; i < (1 << N); i++)
			MIN = min(MIN,count(i));
		if(MIN == INF)
			MIN = -1;
		printf("Case %d: %d\n",mark++, MIN);
	}
	return 0;
}



举报

相关推荐

0 条评论