题意:

一个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. Kafka记录Nginx的POST请求

    最近因为工作原因,需要将Nignx的POST请求数据实时采集到Kafka中.最容易的想到的方案就是通过"tail -f" Nginx的log日志到Kafka的Broker集群中,但 ...

  2. [PHP] constant variable

    print: 3.13 PI 3.14

  3. url传递数据

    一.post传递数据 $ci = curl_init($url); curl_setopt($ci, CURLOPT_HEADER, 0); curl_setopt($ci, CURLOPT_RETU ...

  4. glog日志

    google 开源日志库 #include <glog/logging.h> yum install glog

  5. org.json

    org.json很经典.能解析json和序列化List.Map为json,但是不能自动填充bean.不依赖其它架包. 直接上代码: import java.util.ArrayList; import ...

  6. TextView等组件的LayoutParams不能随便用,不然组件不显示

    TableLayout.LayoutParams lpRow = new TableLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTEN ...

  7. const与预处理宏#define的区别

    在c语言程序设计时,预处理器可以不受限制地建立宏并用它来替代值.因为预处理器只做一些文本替换,宏没有类型检测概念,也没有类型检测功能.所以预处理器的值替换会出现一些小的问题,出现的这些问题,在c++中 ...

  8. hdu-1163(九余数定理)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1163 思路: 九余数定理:一个数对九取余的结果叫做九余数, 一个数的各个位数相加的得到的小于10的数也 ...

  9. hdu-1128(数学问题,筛数)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1128 思路:从0,开始,每次求一个数x的d(x),然后判断如果x没有标记,则说明x没有由任意一个d(i ...

  10. PS各个工具的字母快捷键和英文全名

    选框-Marquee(M) 移动-move(V) 套索-Lasso(L) 魔棒-Wand(W) 喷枪-injection lance (J) 画笔-Brush (B) 铅笔-pencil(N) 橡皮图 ...