偶数矩阵(Even Parity, UVa 11464)

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

(a)                 (b)

【输入格式】

输入的第一行为数据组数TT≤30)。每组数据的第一行为正整数n(1≤n≤15);接下来的n行每行包含n个非0即1的整数,相邻整数间用一个空格隔开。

【输出格式】

对于每组数据,输出被改变的元素的最小个数。如果无解,应输出-1。

思路:

这道题是一道经典的枚举+模拟综合运用的算法

枚举第一排0 1的变化 以此模拟出第二排至第N排的变化

复杂度为    o((2^n)*n*n)

书上的分析:

也许最容易想到的方法就是枚举每个数字“变”还是“不变”,最后判断整个矩阵是否满足条件。遗憾的是,这样做最多需要枚举2255≈5×1067种情况,实在难以承受。

注意到n只有15,第一行只有不超过215=32 768种可能,所以第一行的情况是可以枚举的。接下来根据第一行可以完全计算出第二行,根据第二行又能计算出第三行(想一想,如何计算),以此类推,这样,总时间复杂度即可降为O(2n×n2)。

我的代码如下:

#include<cstdio>
#include<cstring>
using namespace std;
int map[20][20];
int tempmap[20][20];
int ans,n;
int getans(int KT)
{
memset(tempmap,0,sizeof(tempmap));
int cnt=0,temp,k;
for(int i=1;i<=n;i++)
{
temp=KT&1;
KT=KT>>1;
tempmap[1][i]=temp;
if(tempmap[1][i]!=map[1][i])
if(temp==1) cnt++;
else return 0;
}
for(int i=2;i<=n;i++)
for(int j=1;j<=n;j++)
{
k=tempmap[i-1][j-1]+tempmap[i-1][j+1]+tempmap[i-2][j];
if(k%2==1) tempmap[i][j]=1;
else tempmap[i][j]=0; if(tempmap[i][j]!=map[i][j])
if(tempmap[i][j]==1) cnt++;
else return 0;
}
if(cnt<ans) ans=cnt;
return 0;
}
int main()
{
//freopen("a.in","r",stdin);
//freopen("a.out","w",stdout);
int T;
scanf("%d",&T);
int maxn;
int TT=T;
while(T--)
{
ans=2000000000;
scanf("%d",&n);
maxn=(1<<n)-1;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&map[i][j]);
for(int i=0;i<=maxn;i++)
getans(i);
if(ans==2000000000) ans=-1;
printf("Case %d: %d\n",TT-T,ans);
}
return 0;
}

【巧妙算法系列】【Uva 11464】 - Even Parity 偶数矩阵的更多相关文章

  1. 【转载】UVa 11464 Even Parity 偶数矩阵

    题意:给你一个n*n的01矩阵,让你把这个矩阵中尽量少的0转换成1,使得矩阵每个位置的上下左右四个相邻的数加起来能被2整除,求最少的转换数 首先,n 的规模并不大,最大只有15.但是完全枚举整个矩阵显 ...

  2. UVa 11464 Even Parity 偶数矩阵

    给你一个 n * n 的 01 矩阵,现在你的任务是将这个矩阵中尽量少的 0 转化为 1 ,使得每个数的上下左右四个相邻的数加起来是偶数.求最少的转化个数. 首先,n 的规模并不大,最大只有15.但是 ...

  3. UVA.11464 Even Parity (思维题 开关问题)

    UVA.11464 Even Parity (思维题 开关问题) 题目大意 给出一个n*n的01方格,现在要求将其中的一些0转换为1,使得每个方格的上下左右格子的数字和为偶数(如果存在的话),求使得最 ...

  4. 状态压缩+枚举 UVA 11464 Even Parity

    题目传送门 /* 题意:求最少改变多少个0成1,使得每一个元素四周的和为偶数 状态压缩+枚举:枚举第一行的所有可能(1<<n),下一行完全能够由上一行递推出来,b数组保存该位置需要填什么 ...

  5. UVA 11464 Even Parity(递归枚举)

    11464 - Even Parity Time limit: 3.000 seconds We have a grid of size N x N. Each cell of the grid in ...

  6. UVA 11464 Even Parity(部分枚举 递推)

    Even Parity We have a grid of size N x N. Each cell of the grid initially contains a zero(0) or a on ...

  7. UVa 11464 - Even Parity

    解题报告:题目大意有一个N×N的矩阵,矩阵中的元素只有1或0,如果说对于一个矩阵,它的所有的点的上下左右的点的和是偶数,则称这个矩阵为偶数矩阵,现在给你一个任意的矩阵,要求的是如果要把这个矩阵变成偶数 ...

  8. 【巧妙算法系列】【UVA 11384】 Help is needed for Dexter 正整数序列

    Help is needed for Dexter Time Limit: 3 Second Dexter is tired of Dee Dee. So he decided to keep Dee ...

  9. UVA 11464 - Even Parity(枚举方法)

    D Even Parity Input: Standard Input Output: Standard Output We have a grid of size N x N. Each cell ...

随机推荐

  1. CBitmap,HBitmap,Bitmap区别及联系

    加载一位图,可以使用LoadImage: HANDLE LoadImage(HINSTANCE hinst,LPCTSTR lpszName,UINT uType,int cxDesired,int ...

  2. XML读写

    private string fileName = HttpContext.Current.Server.MapPath("~/Student.xml"); protected v ...

  3. SQLSERVER执行时间统计工具SQLQueryStress

    有时候需要检测一下SQL语句的执行时间,相信大家都会用SET STATISTICS TIME ON开关打开SQLSERVER内置的时间统计 SET STATISTICS TIME ON 不过这款小工具 ...

  4. eclipse中运行tomcat找不到jre的解决办法

    一.在eclipse中选择 window--->preferences 二.runtime environment  ----->edit 三.在这个地方就可以进行选择jre了.

  5. qq去广告

    首先呢,在文件资源管理器中选择查看"隐藏的项目"或"显示隐藏的文件.文件夹和驱动器"(入口不一样,选择显示隐藏文件的方式也不一样),随后进入 C:\Users\ ...

  6. poj1088 经典DP

    滑雪 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 88296   Accepted: 33100 Description ...

  7. Windows平台字符的存储和输出分析

    1. 引言 (写于2011-07-30) 在Windows NT系列的操作系统中最常用的两种字符集是ANSI和Unicode.ANSI是一种泛称,每一个国家或地区的ANSI编码都不一样,比如在Wind ...

  8. TCP的状态

    在TCP层,有个FLAGS字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG. 其中,对于我们日常的分析有用的就是前面的五个字段. 它们的含义是: SYN表示建立连 ...

  9. JavaScript当中的eval函数

    eval函数 eval函数接收一个由JavaScript语句组成的字符串,并且返回字符串中最后一条语句的返回值,如果最后一条语句没有返回值,那么eval函数返回undefined.如果传递给eval函 ...

  10. Sumblime Text 2 常用插件以及安装方法

    1.直接安装 安装Sublime text 2插件很方便,可以直接下载安装包解压缩到Packages目录(菜单->preferences->packages). 2.使用Package C ...