题目和poj1222差不多,但是解法有一定区别,1222只要求出任意一解,而本题需要求出最少翻转次数。所以需要枚举自由变元,变元数量为n,则枚举的次数为1<<n次

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=500;
char s[maxn][maxn];
int a[maxn][maxn],x[maxn],fre[maxn];
const int INF=1e9;void debug(int n)
{for(int i=0; i<n; i++){for(int j=0; j<n; j++)printf("%d ",a[i][j]);printf(" %d\n",a[i][n]);}
}void init(int n)
{int dx[]= {0,0,-1,0,1};int dy[]= {0,-1,0,1,0};for(int i=0; i<n; i++){for(int j=0; j<n; j++){for(int k=0; k<5; k++){int x=i+dx[k];int y=j+dy[k];if(x>=0 && x<n && y>=0 && y<n)a[i*n+j][x*n+y]=1;}}}
}int Guass(int equ,int var)
{int k,col,num=0;for(k=0,col=0; k<equ && col<var; k++,col++){int rr=k;for(int i=k; i<equ; i++)if(a[i][col]!=0){rr=i;break;}if(rr!=k)for(int j=col; j<var+1; j++)swap(a[k][j],a[rr][j]);if(a[k][col]==0){k--;fre[num++]=col;continue;}for(int i=k+1; i<equ; i++){if(a[i][col]==0) continue;for(int j=col; j<var+1; j++)a[i][j]^=a[k][j];}}//debug(equ);for(int i=k; i<equ; i++)if(a[i][var]!=0) return -1;int sta=1<<(var-k);//自由变元有var-k个int res=INF;for(int i=0; i<sta; i++) //枚举所有变元
    {int cnt=0;int index=i;for(int j=0; j<num; j++){x[fre[j]]=(index&1);if(x[fre[j]]) cnt++;index>>=1;}for(int row=k-1; row>=0; row--){x[row]=a[row][var];for(col=row+1; col<var; col++)x[row]^=(a[row][col]*x[col]);if(x[row])cnt++;}res=min(cnt,res);}return res;
}int main()
{//freopen("in.txt","r",stdin);int t;scanf("%d",&t);while(t--){memset(a,0,sizeof(a));memset(fre,1,sizeof(fre));int n;scanf("%d",&n);for(int i=0; i<n; i++)scanf("%s",s[i]);for(int i=0; i<n; i++)for(int j=0; j<n; j++)a[i*n+j][n*n]=(s[i][j]=='y'? 0:1);init(n);int ans=Guass(n*n,n*n);if(ans==-1){printf("inf\n");continue;}printf("%d\n",ans);}return 0;
}

转载于:https://www.cnblogs.com/pach/p/6886189.html

POJ 1681 高斯消元 枚举自由变元相关推荐

  1. 开关问题 POJ - 1830 高斯消元

    开关问题 POJ - 1830 有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相联系的开关的状态如果原来为开就变 ...

  2. poj 1830 高斯消元

    终于会一点高斯消元了,认真学还是学的进去啊...... 搞明白解异或方程的原理,然后构造出矩阵就好做了.模板题 1 #include <cstdio> 2 #include <cst ...

  3. POJ 1753 Flip Game 高斯消元

    和1222,1681差不多 POJ 1222 高斯消元更稳 POJ 1681 高斯消元 枚举自由变元 equ = 16 ,var = 16的方程组 #include <cstdio> #i ...

  4. BZOJ 2466 [中山市选2009]树(高斯消元)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2466 [题目大意] 给定一棵树,每个节点有一盏指示灯和一个按钮.如果节点的按扭被按了, ...

  5. POJ 1830 开关问题 高斯消元

    题意:给你N个开关,其中某些开关之间是相互影响的,即一个开关控制多个,那么每个开关操作与否为一个变元,有N个变元,开关之间相互影响的系数设为1,否则为0,对模2高斯消元求解自由变元个数. #inclu ...

  6. ACM数学模板1 高斯消元 Gaussian Elimination

    声明: 题目来源: https://www.luogu.com.cn/problem/P3389 https://www.luogu.com.cn/problem/P2447 https://ac.n ...

  7. poj 1681 Painter#39;s Problem(高斯消元)

    http://poj.org/problem? id=1681 求最少经过的步数使得输入的矩阵全变为y. 思路:高斯消元求出自由变元.然后枚举自由变元,求出最优值. 注意依据自由变元求其它解及求最优值 ...

  8. POJ 1222 1681 1830 3185 开关灯问题 (高斯消元 异或方程组)

    POJ 1222 EXTENDED LIGHTS OUT 基本的开关灯问题.还保证唯一解. 我们把每一个灯泡当成一个状态xi,总共有30个,而且每个灯与其他灯的关系也很明显.所以我们就可以列30方程3 ...

  9. POJ 2947 Widget Factory (高斯消元解同余方程组)

    题意:N种物品,M条记录,接写来M行,每行有K,str1,str2,表示第i个记录从星期str1到星期str2,做了K件物品,接下来的K个数为物品的编号.求做每个物品所需的时间,并且最后结果在3-9之 ...

最新文章

  1. Day43 前端基础--html
  2. python划分代码_多分类评价指标python代码
  3. jQuery Ajax 实例
  4. JS静态变量和静态函数
  5. 通过rhel7的kvm虚拟机实现3节点Postgres-XL(包括gtm standby)
  6. 用PHP的GD库绘制弧形图像
  7. maven项目的pom文件中常用的简单的标签理解
  8. 【数字全排列】LeetCode 47. Permutations II
  9. NLP系列(2)_用朴素贝叶斯进行文本分类(上)
  10. 冲顶,百万答题助手改进(python)
  11. 【渝粤教育】电大中专跨境电子商务理论与实务 (31)作业 题库
  12. hive中的TextFile转为SequenceFile
  13. 如何使用Box2D和Cocos2D制作一款像Fruit Ninja一样的游戏-第3部分
  14. 系统集成项目应怎样管?本文经验值得借鉴
  15. powerpc 配置ddr3
  16. Scrapy爬虫,养眼图片实战
  17. DevOps实战:版本管理实践指南
  18. 前一日函数PreDate(static方法与非static的区别)
  19. 程序员父亲的遗产:编程十大诫
  20. 菲鹏生物冲刺创业板上市:毛利率稳中有降,崔鹏、曹菲夫妇控股

热门文章

  1. 使用NBAR更有效的识别与封堵网络应用
  2. 自动化运维-Ansible (第三部:Playbook 介绍)
  3. javascript经典问题总结及代码实例(未完待续)
  4. 3109. [CQOI2013]新数独【DFS】
  5. 超简单将Centos的yum源更换为国内的阿里云源
  6. Java什么时候提高境界支持async/await写法啊?
  7. spark的异步消息总线LiveListenBus
  8. python随机产生10个随机数_python(random模块)取10以内的随机数
  9. 手机发送验证码的业务逻辑探究-主要是安全性,响应性
  10. linux 系统 网卡 ethX没有显示IP的处理方式