poj1681 Painter's Problem(高斯消元法,染色问题)
题意:
一个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(高斯消元法,染色问题)的更多相关文章
- [POJ1681]Painter's Problem(高斯消元,异或方程组,状压枚举)
题目链接:http://poj.org/problem?id=1681 题意:还是翻格子的题,但是这里有可能出现自由变元,这时候枚举一下就行..(其实这题直接状压枚举就行) /* ━━━━━┒ギリギリ ...
- [Gauss]POJ1681 Painter's Problem
和POJ1222(分析)完全相同 题意也类似, 可以涂自己以及上下左右五个位置的颜色 问几次能全部涂色 不能输出inf 01方程组 用异或来求解就好了 ][]; // 增广矩阵 ]; // 解 ]; ...
- poj1681 Painter's Problem
题目描述: 和那道关灯差不多,求最少涂几次. 题解: 高消,然后深搜枚举自由元更新答案. 貌似这道题没卡贪心但是其他题基本都卡了. 比如$Usaco09Nov$的$lights$ 代码: #inclu ...
- POJ1681 Painter's Problem(高斯消元)
题目看似与线性方程组无关,但可以通过建模转化为线性方程组的问题. 对于一块砖,刷两次是没有必要的,我们令x=1表示刷了一次,x=0没有刷,一共有n*n个,所以相当于有n*n个未知量x. 定义aij表示 ...
- Painter's Problem poj1681 高斯消元法
Painter's Problem Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4420 Accepted: 2143 ...
- poj 1681 Painter's Problem
Painter's Problem 题意:给一个n*n(1 <= n <= 15)具有初始颜色(颜色只有yellow&white两种,即01矩阵)的square染色,每次对一个方格 ...
- POJ 1681 Painter's Problem 【高斯消元 二进制枚举】
任意门:http://poj.org/problem?id=1681 Painter's Problem Time Limit: 1000MS Memory Limit: 10000K Total ...
- Painter's Problem
Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5378 Accepted: 2601 Description There ...
- POJ 1681 Painter's Problem (高斯消元 枚举自由变元求最小的步数)
题目链接 题意: 一个n*n 的木板 ,每个格子 都 可以 染成 白色和黄色,( 一旦我们对也个格子染色 ,他的上下左右 都将改变颜色): 给定一个初始状态 , 求将 所有的 格子 染成黄色 最少需要 ...
随机推荐
- python创建独立虚拟工作环境方法
前言: python的组件非常之多,有时这个项目依赖m个组件,有时那个项目依赖n个组件,时间一长很容易导致系统python环境的臃肿不堪,由此便有了virtualenv.virtualenvwrapp ...
- Codeforces 689B. Mike and Shortcuts SPFA/搜索
B. Mike and Shortcuts time limit per test: 3 seconds memory limit per test: 256 megabytes input: sta ...
- jquery节点获取
jQuery.parent(expr) 找父亲节点,可以传入expr进行过滤,比如$("span").parent()或者$("span").parent(& ...
- cmake 头文件 库文件 链接库
原文地址:http://www.cnblogs.com/binbinjx/p/5626916.html 1. 添加头文件目录INCLUDE_DIRECTORIES 语法: include_direct ...
- 前端之css笔记3
一 display属性 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...
- 2018.09.08 NOIP模拟trip(最长链计数)
差不多是原题啊. 求最长链变成了最长链计数,其余没有变化. 这一次考试为了保险起见本蒟蒻还是写了上次没写的辅助数组. 代码: #include<bits/stdc++.h> #define ...
- hdu-1394(线段树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 思路:建立一个空线段树,求出逆序数,(逆序数性质:交换两个相邻数,逆序数+1或-1, 交换两个不 ...
- Repository模式中,Update总是失败及其解析(转)
出处:http://www.cnblogs.com/scy251147/p/3688844.html 关于Entity Framework中的Attached报错的完美解决方案终极版 前发表过一篇文章 ...
- git分支删除
1.列出本地分支: git branch 2.删除本地分支: git branch -D BranchName 其中-D也可以是--delete,如: git branch --delete Bran ...
- IntelliJ IDEA 2017版 SpringBoot的web项目补充
一.注解 @SpringBootApplication:Spring Boot项目的核心注解,主要目的是开启自动配置. @Configuration:这是一个配置Sprin ...