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;
}




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

hdu5143 暴力枚举

http://acm.hdu.edu.cn/showproblem.php?pid=5143 Problem Description NPY is learning arithmeti...
  • u013573047
  • u013573047
  • 2014年12月14日 20:17
  • 1242

暴力求解法 之 简单枚举

1、除法     输入正整数n,按从小到大的顺序输出所有形如abcde / fghij = n的表达式,其中a~j恰好为0~9的一个排列,2     样例输入:62     样例输出:  79546 ...
  • LYHVOYAGE
  • LYHVOYAGE
  • 2013年07月15日 13:10
  • 4567

UVA 592 逻辑之岛(暴力枚举)

UVA 592 逻辑之岛
  • u011217342
  • u011217342
  • 2013年08月04日 12:53
  • 1501

暴力枚举- uva11464 - Even Parity

题目:给你一个n×n的01矩阵(每个元素非0即1),你的任务是把尽量少的0变成1,使得每个元素的上、下、左、右的元素(如果存在的话)之和均为偶数。比如,如(a)所示的矩阵至少要把3个0变成1,最终如图...
  • Double2hao
  • Double2hao
  • 2016年06月20日 10:48
  • 913

UVA 11464 - Even Parity(枚举方法)

Description D Even Parity Input: Standard Input Output: Standard Output ...
  • u013534690
  • u013534690
  • 2014年10月05日 11:11
  • 403

UVA - 11464 Even Parity 01矩阵——枚举

题意:给定 01 矩阵,问最少改变几个0成为1,使得每个数四周之和为偶数思路:首先想到枚举出所有满足题意的 01 矩阵,然后与原矩阵比较,然而不可实现,继续想到枚举边上的一行或者一列,就可以由此推出整...
  • xiang_6
  • xiang_6
  • 2017年08月03日 16:17
  • 113

UVa 11464 Even Parity (想法题&部分枚举)

11464 - Even Parity Time limit: 3.000 seconds http://uva.onlinejudge.org/index.php?option=com_online...
  • synapse7
  • synapse7
  • 2013年09月03日 08:05
  • 627

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). T...
  • mymilkbottles
  • mymilkbottles
  • 2016年08月09日 17:22
  • 136

Uva 11464 - Even Parity(偶素矩阵)

题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&proble...
  • a1006570862
  • a1006570862
  • 2013年11月22日 14:03
  • 940

Uva11464 - Even Parity

水题一道     题目大意:给你一个n*n的01矩阵,你的任务是将最少的0变成1之后,使整个矩阵每个元素的上下左右值相加之和为偶数。     解题:将给出的矩阵的第一行枚举,无需将每一个元素枚举,...
  • luhao1993
  • luhao1993
  • 2013年09月26日 22:25
  • 249
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:uva 11464 - Even Parity(暴力枚举)
举报原因:
原因补充:

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