Uva11464 - Even Parity

原创 2015年07月09日 10:18:56

We have a grid of size N  N. Each cell of the grid initially contains a zero(0) or a one(1). The parity
of a cell is the number of 1s surrounding that cell. A cell is surrounded by at most 4 cells (top, bottom,
left, right).
Suppose we have a grid of size 4  4:
1 0 1 0 The parity of each cell would be 1 3 1 2
1 1 1 1 2 3 2 1
0 1 0 0 2 1 2 1
0 0 0 0 0 1 0 0
For this problem, you have to change some of the 0s to 1s so that the parity of every cell becomes
even. We are interested in the minimum number of transformations of 0 to 1 that is needed to achieve
the desired requirement.
Input
The rst line of input is an integer T (T < 30) that indicates the number of test cases. Each case starts
with a positive integer N (1 N 15). Each of the next N lines contain N integers (0/1) each. The
integers are separated by a single space character.
Output
For each case, output the case number followed by the minimum number of transformations required.
If it's impossible to achieve the desired result, then output `-1' instead.
Sample Input
3
3
0 0 0
0 0 0
0 0 0
3
0 0 0
1 0 0
0 0 0
3
1 1 1
1 1 1
0 0 0
Sample Output
Case 1: 0
Case 2: 3
Case 3: -1

#include <iostream>
#include <stdio.h>
#include <cstring>
#include <queue>
using namespace std;
const int MAXN = 20;
const int MAX = 1<<20;
int n, ans;
int mp[MAXN][MAXN];
struct node{
    int x, y;
}q[MAXN*MAXN];
int top;
void dfs(int xb,int select)
{
    if(xb==n+1)
    {
        int temp = select;
        bool pd = true;
        top = 0;
        for(int i=1; pd && i<n; i++)
        {
            for(int j=1; pd && j<=n; j++)
            {
                int s = mp[i-1][j] + mp[i+1][j] + mp[i][j+1] + mp[i][j-1];
                if(s%2)
                {   
                    if(mp[i+1][j]==1)
                    {
                        pd = false;
                    }else{
                       q[top].x = i+1;
                       q[top++].y = j;
                        mp[i+1][j]=1;
                        temp++;
                    }
                }
            }
        }
        for(int j=1;  pd &&j<=n; j++)
        {
            int s = mp[n-1][j] + mp[n+1][j] + mp[n][j+1] + mp[n][j-1];
            if(s%2)
            {
                 pd = false;
            }
        }
        if(pd && ans>temp)  ans=temp;
        for(int i=0; i<top; i++)
        {
            mp[q[i].x][q[i].y] = 0;
        }
        return;
    }
    if(mp[1][xb]==1)
    {
        dfs(xb+1,select);
    }else{
        dfs(xb+1,select);
        mp[1][xb] = 1;
        dfs(xb+1,select+1);
        mp[1][xb] = 0;
    }
}
int main()
{
    int t, cs, i, j;
    scanf("%d",&t);
    for(cs=1; cs<=t; cs++)
    {
        scanf("%d",&n);
        memset(mp,0,sizeof (mp));
        for(i=1; i<=n; i++)
        {
            for(j=1; j<=n; j++)
            {
                scanf("%d",&mp[i][j]);
            }
        }
        ans = MAX;
        dfs(1,0);
        if(ans==MAX) ans=-1;
        printf("Case %d: %d\n",cs,ans);
    }
    return 0;
}


 

 

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

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...

Uva 11464 - Even Parity(偶素矩阵)

题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&proble...

Uva11464 - Even Parity

水题一道     题目大意:给你一个n*n的01矩阵,你的任务是将最少的0变成1之后,使整个矩阵每个元素的上下左右值相加之和为偶数。     解题:将给出的矩阵的第一行枚举,无需将每一个元素枚举,...

UVA 11464 - Even Parity(枚举方法)

Description D Even Parity Input: Standard Input Output: Standard Output ...

UVA 11464 Even Parity (独特思路)

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

暴力枚举- uva11464 - Even Parity

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

UVa_11464_Even Parity_机智地搜索

今天一见dui

Even Parity(UVa 11464) 开关问题

来自《算法竞赛入门经典训练指南》 这道题和《挑战程序设计竞赛》上的例题很像,可参考博文http://blog.csdn.net/qq_33929112/article/details/52490729...

(uva 11464)偶数矩阵(Even Parity)

学位运算的时候以为用不上看了几眼直接就跳过了……结果这次吃亏了……在老师的指导下第一次学会了位运算,留念~具体见代码注释~ 11464 - Even Parity Time limit: ...

UVa-11464 Even Parity

题目概述: 给你一个N*N的矩阵,元素为0或1。问你最少把几个0变成1能使每一个元素上下左右(存在哪个加哪个)元素加起来是偶数。如果做不到输出-1; 思路: N是 比如,n=3.那么,需要枚举...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Uva11464 - Even Parity
举报原因:
原因补充:

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