POJ 1681 高斯消元 枚举自由变元
题目和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 高斯消元 枚举自由变元的更多相关文章
- POJ 1681 Painter's Problem(高斯消元+枚举自由变元)
http://poj.org/problem?id=1681 题意:有一块只有黄白颜色的n*n的板子,每次刷一块格子时,上下左右都会改变颜色,求最少刷几次可以使得全部变成黄色. 思路: 这道题目也就是 ...
- POJ 1681 Painter's Problem (高斯消元 枚举自由变元求最小的步数)
题目链接 题意: 一个n*n 的木板 ,每个格子 都 可以 染成 白色和黄色,( 一旦我们对也个格子染色 ,他的上下左右 都将改变颜色): 给定一个初始状态 , 求将 所有的 格子 染成黄色 最少需要 ...
- POJ 1753 Flip Game (高斯消元 枚举自由变元求最小步数)
题目链接 题意: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:// ...
- POJ 3185 The Water Bowls(高斯消元-枚举变元个数)
题目链接:http://poj.org/problem?id=3185 题意:20盏灯排成一排.操作第i盏灯的时候,i-1和i+1盏灯的状态均会改变.给定初始状态,问最少操作多少盏灯使得所有灯的状态最 ...
- poj1222 EXTENDED LIGHTS OUT 高斯消元||枚举
Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 8481 Accepted: 5479 Description In an ...
- POJ SETI 高斯消元 + 费马小定理
http://poj.org/problem?id=2065 题目是要求 如果str[i] = '*'那就是等于0 求这n条方程在%p下的解. 我看了网上的题解说是高斯消元 + 扩展欧几里德. 然后我 ...
- POJ 2065 高斯消元求解问题
题目大意: f[k] = ∑a[i]*k^i % p 每一个f[k]的值就是字符串上第 k 个元素映射的值,*代表f[k] = 0 , 字母代表f[k] = str[i]-'a'+1 把每一个k^i求 ...
- *POJ 1222 高斯消元
EXTENDED LIGHTS OUT Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9612 Accepted: 62 ...
随机推荐
- 分析Red Hat sosreport输出的方法
分析Red Hat sosreport输出的方法? Modified on: Fri, 31 May 2019 20:20:02 +0800 有一段时间(自EL 4.6以来),Red Hat嵌入了sy ...
- CPU缓存是位于CPU与内存之间的临时数据交换器,它的容量比内存小的多但是交换速度却比内存要快得多。CPU缓存一般直接跟CPU芯片集成或位于主板总线互连的独立芯片上
一.什么是CPU缓存 1. CPU缓存的来历 众所周知,CPU是计算机的大脑,它负责执行程序的指令,而内存负责存数据, 包括程序自身的数据.在很多年前,CPU的频率与内存总线的频率在同一层面上.内存的 ...
- linux进阶之子网划分
一.定义 当我们对一个网络进行子网划分时,基本上就是将它分成小的网络.比如,当一组IP地址指定给一个公司时,公司可能将该网络"分割成"小的网络,每个部门一个.这样,技术部门和管理部 ...
- 大对象数据LOB的应用(Day_10)
当你有永不放弃的精神,全力以赴的态度,你会惊叹自己也能创造奇迹! LOB数据类型概述 由于于无结构的数据往往都是大型的,存储量非常大,而LOB(large object)类型主要用来支持无结构的大型数 ...
- Python中if name == 'main':的作用
一个python文件通常有两种使用方法, 第一是作为脚本直接执行. 第二是 import 到其它的 python 脚 本中被调用(模块重用)执行. 因此 if name == 'main': 的作用就 ...
- Linux(CentOS7)下配置多个tomcat
记录 Linux(CentOS7) 下配置多个 tomcat 的操作过程. 一.下载tomcat 前提:安装配置好jdk环境,未配置可参考Linux(CentOS7)下安装jdk1.8. 从 tomc ...
- 【odoo14】【用户侧】权限配置
以下内容仅适用于odoo的客户,不适用于开发人员. 下文介绍中涉及的概念及UI均是在odoo14社区版中进行. 目录 一. odoo中的对象 二. 权限控制 2.1 实现原理 2.2 UI方式实现权限 ...
- 快速上手 Linkerd v2 Service Mesh(服务网格)
在本指南中,我们将引导您了解如何将 Linkerd 安装到您的 Kubernetes 集群中. 然后我们将部署一个示例应用程序来展示 Linkerd 的功能. 安装 Linkerd 很容易.首先,您将 ...
- Prometheus监控软件部署方法
背景:负责基于区块链的某公正项目的状态上报模块设计编码,基于Prometheus进行二次开发 1.说明Prometheus 是一个开源的服务监控软件,它通过 HTTP 协议从远程机器收集数据并存储在本 ...
- ALD对照CVD淀积技术的优势
ALD对照CVD淀积技术的优势 ALD 适合制备很薄的高K金属氧化物层,对腔室的真空度要求比较高,对反应气体源及比例的要求也较高. 目前沉积速率还是比较慢,大大限制了其在工业上的推广应用,不过随着设备 ...