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 BNU19882 Even Parity

Even Parity Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVA. ...
  • xky140610205
  • xky140610205
  • 2016年10月10日 10:14
  • 132

UVA11464 Even Parity

做法: 枚举第一行的所有的情况。然后根据第一行的情况,推出第二行,以此类推 然后就是原来矩阵中的1不能变成0. 根据前两行推出这一行,就是一个点的上下左右加起来要等于偶数。根据这一个推的。 #...
  • KJBU2
  • KJBU2
  • 2014年12月03日 03:31
  • 342

暴力枚举- uva11464 - Even Parity

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

uva11464 - Even Parity

应该是属于暴力枚举类型的题目 然后这个问题和开关灯的问题的解决办法很类似 然后这两个题目我都没有什么解决办法…… 这种矩阵里面计数或者是寻求最少改变数字类型的题目,往往就U懵掉,只是去找规律去寻求自己...
  • u013382399
  • u013382399
  • 2014年08月05日 09:23
  • 569

Uva11464 - Even Parity

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

uva11464 Even Parity

题意:给一个nXn的01矩阵,你的任务是把尽量少的0变成1,使得每个元素的上下左右之和均为偶数 思路:显然枚举每一位是不现实的,注意到n只有15,第一行只有不超过2^15种可能,那么可以枚举第一行,...
  • qq_21057881
  • qq_21057881
  • 2016年03月16日 10:01
  • 131

uva11464 - EVen Parity (枚举)

题意:    一个n*n矩阵(由0/1组成),将尽量少的0变成1,使得每个元素上下左右(有的画)的元素之和为偶数,求改变的元素的最小个数,无解则输出-1; 思路:   枚举第一行(最多为15),...
  • conatic
  • conatic
  • 2016年01月24日 15:18
  • 194

uva11464 - Even Parity(偶数矩阵)

容易想到的方法就是对每个数字枚举,最后判断整个矩阵是否符合条件。 但这样的话我们需要枚举2^255 = 5*10^67种情况,肯定会超时 如果我们模拟一遍,亲手算一算,我们会发现只要第n行确定了,第...
  • shankeliupo
  • shankeliupo
  • 2013年04月22日 17:30
  • 731

【思维】uva11464 Even Parity 偶数矩阵

题目链接 题目描述:对一个n∗n(1
  • cqbztsy
  • cqbztsy
  • 2015年08月24日 20:23
  • 203

even parity

转自http://www.acmerblog.com/uva-11464-even-parity-4653.html 这道题的算法实现态变态了
  • gaokuilin1060083530
  • gaokuilin1060083530
  • 2014年07月20日 21:41
  • 528
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Uva11464 - Even Parity
举报原因:
原因补充:

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