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 的木板 ,每个格子 都 可以 染成 白色和黄色,( 一旦我们对也个格子染色 ,他的上下左右 都将改变颜色): 给定一个初始状态 , 求将 所有的 格子 染成黄色 最少需要 ...
随机推荐
- 在winform嵌入外部应用程序
应朋友要求,需要将一个第三方应用程序嵌入到本程序WinForm窗口,以前在VB6时代做过类似的功能,其原理就是利用Windows API中FindWindow函数找到第三方应用程序句柄,再利用SetP ...
- 2018.10.16 spoj Can you answer these queries V(线段树)
传送门 线段树经典题. 就是让你求左端点在[l1,r1][l1,r1][l1,r1]之间,右端点在[l2,r2][l2,r2][l2,r2]之间且满足l1≤l2,r1≤r2l1\le l2,r1 \l ...
- 微信post xml 消息编码问题
site:mp.weixin.qq.com utf 微信卡券接口说明 - 微信公众平台开发者文档 所有API接口POST的数据只支持utf8编码,否则会返回报错. 以上是获取的部分信息 这个尽管有点模 ...
- No cache or cacheManager properties have been set. Authorization cache cannot be obtained.
20235 [http-bio-8080-exec-10] INFO o.a.shiro.realm.AuthorizingRealm - No cache or cacheManager prope ...
- 可视化iOS应用程序开发的6个Xcode小技巧
FIXME 该标签用来提醒你代码中存在稍后某个时间需要修改的部分.(编辑注:网络上有一些可以用来收集项目中`TODO`和`FIXME`标签的辅助插件,比如XToDo https://github.co ...
- eclipse如何恢复误删文件
刚刚真的要吓死宝宝了,不是说宝宝心里素质差,是因为刚刚误删的文件实在是太重要了,废话不多说了,正题 如何恢复eclipse误删的文件 1,当时被误删了,可立即 Ctrl+z 即可恢复误删文件; 2,时 ...
- Docker搭建 MySQL 主从复制
为什么选 Docker 搭建主从复制需要两个以上的MySQL, 使用 Docker 非常方便.如果以前没用过,找个简单的文档看看,熟悉一下命令. 搭建过程 1.下载镜像 docker pull mys ...
- fully delete project in Eclipse
选择你的项目(test)右击,选择delete——弹出框中勾选删除全部,如下如所示: 正常情况下,这样就能删除干净了,有时候你项目在运行,这时候你点击删除,那就会报下面的错误提示,虽然不会影响你其它项 ...
- php连接微软MSSQL(sql server)完全攻略
http://www.jb51.net/article/98364.htm php连接微软MSSQL(sql server)完全攻略 作者:吵吵 字体:[增加 减小] 类型:转载 时间:2016-11 ...
- 发展科技到底有什么用,转NASA专家给一位修女的一封信
问题补充:我们难道不应该把这些资金用于更深入的医疗保障和减少贫穷吗? 我们为何要仰望星空,花大量的金钱和精力探索那不可预知的宇宙呢?NASA科学家写给非洲修女的一封信回答得特别好,也特别震撼人心.—— ...