UVa --- 10464 Even Parity 偶数矩阵 【状态压缩 + 暴力枚举 + 思维】
2017-08-16 18:35
405 查看
传送门
//题意: 给你一个01矩阵, 问最少操作几次可以使得这个矩阵的任意一个元素的上下左右元素加起来是偶数. 操作是指可以将这个矩阵中的0变成1. 但是1不能变成0.
//思路: 由于n最大只有15, 所以我们可以考虑用二进制状压枚举出第一行的状态, 然后依次判断下面的状态, 最后得出的那个矩阵和原先的矩阵比较一下, 看有进行了多少次操作. 取最小的那次即可, 如果不能继续走下去了, 记得及时退出. 还要注意是一个元素的上下左右之和为偶数, 所以影响当前位是0还是1的是它的左上角和右上角和它上面二行的那三个元素(如果有的话). 所以判断是注意下写法.
//因为一个n最大才15,又只有01, 所以用15个字节就可以存下. 那么我就用的一个int位来存的.
AC Code
//题意: 给你一个01矩阵, 问最少操作几次可以使得这个矩阵的任意一个元素的上下左右元素加起来是偶数. 操作是指可以将这个矩阵中的0变成1. 但是1不能变成0.
//思路: 由于n最大只有15, 所以我们可以考虑用二进制状压枚举出第一行的状态, 然后依次判断下面的状态, 最后得出的那个矩阵和原先的矩阵比较一下, 看有进行了多少次操作. 取最小的那次即可, 如果不能继续走下去了, 记得及时退出. 还要注意是一个元素的上下左右之和为偶数, 所以影响当前位是0还是1的是它的左上角和右上角和它上面二行的那三个元素(如果有的话). 所以判断是注意下写法.
//因为一个n最大才15,又只有01, 所以用15个字节就可以存下. 那么我就用的一个int位来存的.
AC Code
/** @Cain*/ const int maxn=15+5; int mapp[maxn]; int tmp[maxn]; int n; //先写好二进制位操作需要的操作函数. int Getbit(int c,int i) {//取数字c的第i个bit. return (c >> i) & 1; } void Setbit(int & c,int i,int v) {//把c的第i位设置成v. if(v ) c |= (1 << i); else c &= ~(1 << i); } void Flipbit(int & c ,int i) { //把c的第i位翻转.(1 翻为0 , 0 翻为 1). c ^= (1 << i) ; } int cal(int k) { Fill(tmp,0); for(int i=0;i<n;i++){ if(Getbit(k,i)) Setbit(tmp[0],i,1); else if(Getbit(mapp[0],i)) return inf; //1不能变成0. } for(int i=1;i<n;i++){ for(int j=0;j<n;j++){ int sum = 0; //这个元素的位置对应的上一行的位置的上,左,右3个元素的和. if(j>0) sum += Getbit(tmp[i-1],j-1); //好好理解题意和思维啊!!! if(j<n-1) sum += Getbit(tmp[i-1],j+1); if(i>1) sum += Getbit(tmp[i-2],j); //如果不懂这三句话的意思,请再仔细看看题! if(sum&1) Setbit(tmp[i],j,1); else if(Getbit(mapp[i],j)) return inf; //1不能变成0. } } int cnt = 0; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(Getbit(mapp[i],j) != Getbit(tmp[i],j)) cnt++; } } return cnt; } void solve() { scanf("%d",&n); Fill(mapp,0); Fill(tmp,0); for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ int k; scanf("%d",&k); Setbit(mapp[i],j,k); } } int res = inf; bool flag = false; for(int k=0;k<(1<<n);k++){ res = min(res,cal(k)); } printf("Case %d: ",cas++); printf("%d\n",res==inf?-1:res); }
相关文章推荐
- UVa 11464-Even Parity 偶数矩阵-bitmask+暴力
- problem/868/C Qualification Rounds 思维题 状态压缩 暴力枚举
- 【思维】uva11464 Even Parity 偶数矩阵
- 状态压缩+枚举 UVA 11464 Even Parity
- UVA1508-Equipment(状态压缩+暴力枚举)
- 例题1.7 偶数矩阵 Even Parity UVA - 11464 部分枚举+递推
- UVA 11464 Even Parity(状态压缩)
- uva11464 - Even Parity(偶数矩阵)
- HDU4770 —— Lights Against Dudely (状态压缩,暴力枚举)
- UVa 1508 - Equipment (状态压缩 + 枚举子集)
- POJ 3279 (状态压缩暴力枚举)
- 【巧妙算法系列】【Uva 11464】 - Even Parity 偶数矩阵
- uva1508(状态压缩 +枚举)
- 【巧妙算法系列】【Uva 11464】 - Even Parity 偶数矩阵
- UVA - 565 Pizza Anyone?(状态压缩+暴利枚举)
- UVa 11464 偶数矩阵 枚举
- UVA 11825 - Hackers' Crackdown 状态压缩 dp 枚举子集
- [POJ3600]Subimage Recognition(状态压缩,枚举,暴力)
- 第一章例题7偶数矩阵UVa 11464(枚举)
- HDU5816(2016多校第七场)——Hearthstone(暴力枚举,状态压缩)