uva 11464 - Even Parity(暴力枚举)

原创 2013年12月03日 20:20:42

题目链接:uva 11464 - Even Parity


题目大意:给出一个由0和1组成的矩阵,修改最少的0变成1,使得矩阵中每个位置的上下左右存在的情况下,和为偶数,无解输出-1。


解题思路:枚举,但是枚举所有位置的话,n最大为15,有2^255,肯定超时。但是不难发现,如果确定了i行,那么i + 1行肯定是确定。所以只要枚举第一行就可以了。


#include <stdio.h>
#include <string.h>

const int N = 20;
const int INF = 0x3f3f3f3f;
const int dir[][2] = { {0, 1}, {0, -1}, {-1, 0} };

int n, ans, v[N][N], s[N][N];

void init() {

	ans = INF;
	memset(v, 0, sizeof(v));
	memset(s, 0, sizeof(s));

	scanf("%d", &n);
	for (int i = 0; i < n; i++)
		for (int j = 0; j < n; j++)
			scanf("%d", &v[i][j]);
}

int count(int x, int y) {
	int tmp = 0;

	for (int i = 0; i < 3; i++) {
		int p = x + dir[i][0], q = y + dir[i][1];
		if (p < 0 || p >= n) continue;
		if (q < 0 || q >= n) continue;

		tmp += s[p][q];
	}
	return tmp;
}

void solve() {
	int tmp = 0;

	for (int i = 0; i < n; i++)
		if (v[0][i] != s[0][i]) tmp++;

	for (int i = 1; i < n; i++) {
		for (int j = 0; j < n; j++) {
			int k = count(i - 1, j);

			if (k % 2 == 1) {
				s[i][j] = 1;
				if (v[i][j] == 0)	tmp++;
			} else {
				s[i][j] = 0;
				if (v[i][j]) return;
			}
		}
	}

	if (tmp < ans)	ans = tmp;

}

void dfs(int c) {
	if (c == n) {
		solve();
		return;
	}

	s[0][c] = 1;
	dfs(c + 1);

	if ( v[0][c] == 0) {
		s[0][c] = 0;
		dfs(c + 1);
	}
}

int main () {
	int cas;
	scanf("%d", &cas);
	for (int i = 1; i <= cas; i++) {
		init();

		dfs(0);

		printf("Case %d: ", i);
		if (ans == INF) printf("-1\n");
		else printf("%d\n", ans);
	}
	return 0;
}




版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

uva - 11464 - Even Parity(部分枚举,递推)

题意:给你一个nxn的矩阵01矩阵,(每个元素非0就1),你的任务是把尽量少的0变成1,使矩阵的每个元素的上下左右的元素只和均为偶数。 方法:枚举每个数字变或者不变有2^255太大。但是枚举第一行只...

Uva-11464-Even Parity

这个问将所给m*n的01矩阵,需要求出最少将0变成1的次数,使得所有点的上下左右之和为偶数。有题目的要求可以知道如果对整个地图用DFS的话会超时,而且超时会很严重,而通过观察可以发现后面的几行可以由第...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

UVA 11464 Even Parity (独特思路)

题意:有一个n*n的01矩阵,任务是把尽可能少的0变成1,使得每个元素的上、下、左、右元素之和为偶数。 思路:很容易想到的思路是枚举每个点是0还是1,因为n#include #include #...

Uva11464 - Even Parity

We have a grid of size N  N. Each cell of the grid initially contains a zero(0) or a one(1). The par...

uva 11464 Even Parity(逐层递推)

uva 11464 Even Parity We have a grid of size N x N. Each cell of the grid initially contains ...

uva 11464(贪心)

题意:给了一个n*n的矩阵,矩阵元素不是0就是1,需要把尽量少的0变为1,使每个元素的上下左右和为偶数,问改变的元素的个数,如果无解输出-1。 题解:因为直接全部枚举会超时,可以考虑只枚举一行的,然...

【巧妙算法系列】【Uva 11464】 - Even Parity 偶数矩阵

例题7  偶数矩阵(Even Parity, UVa 11464) 给你一个n×n的01矩阵(每个元素非0即1),你的任务是把尽量少的0变成1,使得每个元素的上、下、左、右的元素(如果存在的话)之和...

UVa 11464 Even Parity / 深搜

算是一类的题目 zoj也看到过 今天终于写了 给你一个0 1 的矩阵 可以把0变成1 1 不能变成0 然后最小的变换次数是每一个位置的上下左右加起来的和是偶数 枚举第一行 根据第一行下面的都已经确定了...

UVA11464偶数矩阵

题意:       给你一个n*n的01矩阵,你的你的任务是吧尽量少的0变成1,使得每个元素的上下左右之和均为偶数(如果有的话),比如 0 0 0         0 1 0 1 0 0  --...

uva11464

题目大意: 给出一个矩阵,说明使用最少的改变(把0变成1)使得矩阵中的每一个数的前后左右加起来都是偶数。思路: 枚举第一行,推出第二行第三行。。。代码:#include using namesp...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)