题意:

一个n*n 的木板 ,每个格子 都 可以 染成 白色和黄色,( 一旦我们对也个格子染色 ,他的上下左右都将改变颜色);

给定一个初始状态 , 求将 所有的 格子 染成黄色 最少需要染几次?  若 不能 染成 输出 inf。

高斯消元,写得很懵逼。慢慢理解orz。

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<string>
#define Inf 0x3fffffff
#define maxn 300
using namespace std;
int n;
int a[maxn][maxn]; //增广矩阵
int x[maxn]; //解集
int free_x[maxn]; //标记是否为不确定的变元
void init(){
memset(a,,sizeof(a));
memset(x,,sizeof(x));
memset(free_x,,sizeof(free_x));
for (int i=;i<n;i++){
for (int j=;j<n;j++){
int t=i*n+j;
a[t][t]=;
if (i>) a[(i-)*n+j][t]=;
if (i<n-) a[(i+)*n+j][t]=;
if (j>) a[i*n+j-][t]=;
if (j<n-) a[i*n+j+][t]=;
}
}
}
// 高斯消元法解方程组(Gauss-Jordan elimination).(-2表示有浮点数解,但无整数解,
//-1表示无解,0表示唯一解,大于0表示无穷解,并返回自由变元的个数)
//有equ个方程,var个变元。增广矩阵行数为equ,分别为0到equ-1,列数为var+1,分别为0到var.
int Gauss(int equ,int var){
for (int i=;i<=var;i++){
x[i]=;
free_x[i]=;
}
int i,j,k,num=;
int now=;//当前处理的列
for (k=;k<equ && now<var;k++,now++){ //枚举行
int max_r=k;
for (i=k+;i<equ;i++){
if (abs(a[i][now])>abs(a[max_r][now])) max_r=i;
}
if (max_r!=k){//与第i行交换
for (j=k;j<=var;j++) swap(a[k][j],a[max_r][j]);
}
if (a[k][now]==){// 说明该now列第k行以下全是0了,则处理当前行的下一列.
k--;
free_x[num++]=now;
continue;
}
for (i=k+;i<equ;i++){
if (a[i][now]!=){
for (j=now;j<=var;j++){
a[i][j]^=a[k][j];
}
}
}
}
// 1. 无解的情况: 化简的增广阵中存在(0, 0, ..., a)这样的行(a != 0).
for (i=k;i<equ;i++){
// 对于无穷解来说,如果要判断哪些是自由变元,那么初等行变换中的交换就会影响,则要记录交换.
if (a[i][now]!=) return -;
}
int stat=<<(var-k); //自由变元有 var-k 个
int res=Inf;
for (i=;i<stat;i++){ //枚举所有变元
int cnt=,index=i;
for (j=;j<var-k;j++){
x[free_x[j]]=(index&);
if (x[free_x[j]]) cnt++;
index>>=;
}
for (j=k-;j>=;j--){
int tmp=a[j][var];
for (int l=j+;l<var;l++){
if (a[j][l]) tmp^=x[l];
}
x[j]=tmp;
if (x[j]) cnt++;
}
if (cnt<res) res=cnt;
}
return res;
}
int main(){
int t;
cin >> t;
string str;
while (t--){
cin >> n;
init();
for (int i=;i<n;i++){
cin >> str;
for (int j=;j<n;j++){
if (str[j]=='y') a[i*n+j][n*n]=;
else a[i*n+j][n*n]=;
}
}
int k=Gauss(n*n,n*n);
if (k==-) cout << "inf\n";
else cout << k << endl;
}
return ;
}

poj1681 Painter's Problem(高斯消元法,染色问题)的更多相关文章

  1. [POJ1681]Painter's Problem(高斯消元,异或方程组,状压枚举)

    题目链接:http://poj.org/problem?id=1681 题意:还是翻格子的题,但是这里有可能出现自由变元,这时候枚举一下就行..(其实这题直接状压枚举就行) /* ━━━━━┒ギリギリ ...

  2. [Gauss]POJ1681 Painter's Problem

    和POJ1222(分析)完全相同 题意也类似, 可以涂自己以及上下左右五个位置的颜色 问几次能全部涂色 不能输出inf 01方程组 用异或来求解就好了 ][]; // 增广矩阵 ]; // 解 ]; ...

  3. poj1681 Painter's Problem

    题目描述: 和那道关灯差不多,求最少涂几次. 题解: 高消,然后深搜枚举自由元更新答案. 貌似这道题没卡贪心但是其他题基本都卡了. 比如$Usaco09Nov$的$lights$ 代码: #inclu ...

  4. POJ1681 Painter's Problem(高斯消元)

    题目看似与线性方程组无关,但可以通过建模转化为线性方程组的问题. 对于一块砖,刷两次是没有必要的,我们令x=1表示刷了一次,x=0没有刷,一共有n*n个,所以相当于有n*n个未知量x. 定义aij表示 ...

  5. Painter's Problem poj1681 高斯消元法

    Painter's Problem Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4420   Accepted: 2143 ...

  6. poj 1681 Painter's Problem

    Painter's Problem 题意:给一个n*n(1 <= n <= 15)具有初始颜色(颜色只有yellow&white两种,即01矩阵)的square染色,每次对一个方格 ...

  7. POJ 1681 Painter's Problem 【高斯消元 二进制枚举】

    任意门:http://poj.org/problem?id=1681 Painter's Problem Time Limit: 1000MS   Memory Limit: 10000K Total ...

  8. Painter's Problem

    Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5378   Accepted: 2601 Description There ...

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

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

随机推荐

  1. EXPAT(XML解析库)

    一.简介 expat是一个由C语言编写的XML解析库.James Clark创建了这个库,现在是制定XML标准的W3组织的技术leader.现在的版本是2.0.2.0开始就由Clark Cooper领 ...

  2. Codeforces 710C. Magic Odd Square n阶幻方

    C. Magic Odd Square time limit per test:1 second memory limit per test:256 megabytes input:standard ...

  3. 慢工出细活,Facebook点赞按钮设计中的门道

    一年前,Facebook点赞按钮发布更新.一年后的今天,Facebook小小的点赞按钮因为Ted刚发布的一段演讲掀起波澜.设计一个像FB点赞按钮那么小的东西很难么?Ted中Margaret Gould ...

  4. Debian8 下面 muduo库编译与使用

    其实<Linux 多线程服务端编程>已经写得很详细 但是考虑到代码版本的更新和操作系统的不同 可能部分位置会有些许出入 这里做个记录 方便以后学习运行 我使用的虚拟 安装的是debian系 ...

  5. oracle常用函数速记

    1.截断中文字符串 CREATE OR REPLACE function cn_cutstr(v_str varchar2,v_len number) return varchar2 IS v_i n ...

  6. sqlserver 清除日志

    要使用Master数据库执行 DUMP TRANSACTION 数据库名 WITH NO_LOG 2.再打开企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件--选择日志文件-- ...

  7. html自适应布局,@media screen,媒体查询

    html自适应布局,@media screen,媒体查询 自适应代码示例: <!doctype html> <html> <head> <meta chars ...

  8. 关于iOS的自动弹出键盘问题

    -(void)viewWillAppear:(BOOL)animated {     [super viewWillAppear:animated];     [self.textField beco ...

  9. MySQL性能调优与架构设计——第12章 可扩展设计的基本原则

    第12章 可扩展设计的基本原则 前言: 随着信息量的飞速增加,硬件设备的发展已经慢慢的无法跟上应用系统对处理能力的要求了.此时,我们如何来解决系统对性能的要求?只有一个办法,那就是通过改造系统的架构体 ...

  10. D3_book 7 area

    <!-- area的例子csv使用node.js提供的 --> <!DOCTYPE html> <meta charset="utf-8"> & ...