题目和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;
}

POJ 1681 高斯消元 枚举自由变元的更多相关文章

  1. POJ 1681 Painter's Problem(高斯消元+枚举自由变元)

    http://poj.org/problem?id=1681 题意:有一块只有黄白颜色的n*n的板子,每次刷一块格子时,上下左右都会改变颜色,求最少刷几次可以使得全部变成黄色. 思路: 这道题目也就是 ...

  2. POJ 1681 Painter's Problem (高斯消元 枚举自由变元求最小的步数)

    题目链接 题意: 一个n*n 的木板 ,每个格子 都 可以 染成 白色和黄色,( 一旦我们对也个格子染色 ,他的上下左右 都将改变颜色): 给定一个初始状态 , 求将 所有的 格子 染成黄色 最少需要 ...

  3. POJ 1753 Flip Game (高斯消元 枚举自由变元求最小步数)

    题目链接 题意:4*4的黑白棋,求把棋全变白或者全变黑的最小步数. 分析:以前用状态压缩做过. 和上题差不多,唯一的不同是这个终态是黑棋或者白棋, 但是只需要把给的初态做不同的两次处理就行了. 感觉现 ...

  4. POJ 1222 POJ 1830 POJ 1681 POJ 1753 POJ 3185 高斯消元求解一类开关问题

    http://poj.org/problem?id=1222 http://poj.org/problem?id=1830 http://poj.org/problem?id=1681 http:// ...

  5. POJ 3185 The Water Bowls(高斯消元-枚举变元个数)

    题目链接:http://poj.org/problem?id=3185 题意:20盏灯排成一排.操作第i盏灯的时候,i-1和i+1盏灯的状态均会改变.给定初始状态,问最少操作多少盏灯使得所有灯的状态最 ...

  6. poj1222 EXTENDED LIGHTS OUT 高斯消元||枚举

    Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 8481   Accepted: 5479 Description In an ...

  7. POJ SETI 高斯消元 + 费马小定理

    http://poj.org/problem?id=2065 题目是要求 如果str[i] = '*'那就是等于0 求这n条方程在%p下的解. 我看了网上的题解说是高斯消元 + 扩展欧几里德. 然后我 ...

  8. POJ 2065 高斯消元求解问题

    题目大意: f[k] = ∑a[i]*k^i % p 每一个f[k]的值就是字符串上第 k 个元素映射的值,*代表f[k] = 0 , 字母代表f[k] = str[i]-'a'+1 把每一个k^i求 ...

  9. *POJ 1222 高斯消元

    EXTENDED LIGHTS OUT Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9612   Accepted: 62 ...

随机推荐

  1. python类传参示例

    1 class f(): 2 3 def __init__(self, *args, **kwargs): 4 print('args Is', args) # args Is ('5', 'fff' ...

  2. Docker——Registry 通过Shell管理私有仓库镜像

    使用方法: 复制代码保存为 image_registry.sh sh image_registry.sh  -h   #查看帮助 HUB=10.0.29.104:5000 改为自己的地址 #!/bin ...

  3. docker容器中日志文件过大处理方法

    背景 :在日常工作中一个基于centos镜像构建起来的python爬虫程序,日志文件在两个月内到了500G,日志存放在根目录下面,在不扩容的情况下把这个问题给解决掉.通过定时任务和脚本的方法,定期的清 ...

  4. 在vue中如何使用WebSocket 以及nginx代理如何配置WebSocket

    WebSocket WebSocket是一种网络传输协议,可在单个TCP连接上进行全双工通信.浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输. 浏览器支持情况 现 ...

  5. 重新整理 .net core 实践篇—————配置系统之简单配置中心[十一]

    前言 市面上已经有很多配置中心集成工具了,故此不会去实践某个框架. 下面链接是apollo 官网的教程,实在太详细了,本文介绍一下扩展数据源,和简单翻翻阅一下apollo 关键部分. apollo 服 ...

  6. volatile 关键字笔记

    你应该知道的 volatile 关键字 当一个变量被 volatile 修饰时,任何线程对它的写操作都会立即刷新到主内存中,并且会强制让缓存了该变量的线程中的数据清空,必须从主内存重新读取最新数据. ...

  7. GO学习-(21) Go语言基础之Go性能调优

    Go性能调优 在计算机性能调试领域里,profiling 是指对应用程序的画像,画像就是应用程序使用 CPU 和内存的情况. Go语言是一个对性能特别看重的语言,因此语言中自带了 profiling ...

  8. python+selenium基础篇,键盘操作

    1.任务要求:打开百度,在百度搜索里面输入python,通过键盘复制python到搜狗搜索,粘贴到搜狗搜索框中 实现代码如下: from selenium import webdriver from ...

  9. java后端知识点梳理——MySQL

    MySQL的索引 索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息,就像一本书的目录一样,可以加快查询速度.InnoDB 存储引擎的索引模型底层实现数据结构为 ...

  10. 狂神说Mybatis笔记

    环境说明: jdk 8 + MySQL 5.7.19 maven-3.6.1 IDEA 学习前需要掌握: JDBC MySQL Java 基础 Maven Junit 第一节:入门 什么是MyBati ...