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 的木板 ,每个格子 都 可以 染成 白色和黄色,( 一旦我们对也个格子染色 ,他的上下左右 都将改变颜色): 给定一个初始状态 , 求将 所有的 格子 染成黄色 最少需要 ...
随机推荐
- Java图形化界面设计——布局管理器之GridBagLayout
GridBagLayout 不会随着窗口的变化标签随之发生变化,可固定. ---------------------------------------------------------- impo ...
- (转载)Zab vs. Paxos
原创链接:https://cwiki.apache.org/confluence/display/ZOOKEEPER/Zab+vs.+Paxos Is Zab just a special imple ...
- 201621123008 《Java程序设计》第五周学习总结
1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 关键词:接口,内部类. 1.2 尝试使用思维导图将这些关键词组织起来.注:思维导图一般不需要出现过多的字. 1.3 可选:使用常 ...
- Codeforces 600A. Extract Numbers 模拟
A. Extract Numbers time limit per test: 2 seconds memory limit per test: 256 megabytes input: standa ...
- Microsoft DirectX SDK 2010 版本下载
Microsoft DirectX SDK 2010 版本下载 Version:Date Published:9.29.19626/7/2010File name:File size:DXSDK_Ju ...
- css样式记忆
text-indent: 2em; //开头空两格: display : none; //隐藏元素 background:#CCC; //背景颜色 background: url(imag ...
- Number.isInteger在IE中报错的解决方法
if (!Number.isInteger) { Number.isInteger = function(num) { return typeof num == "number" ...
- 2018.08.22 NOIP模拟 or(线段树)
or [描述] 构造一个长度为 n 的非负整数序列 x,满足 m 个条件,第 i 个条件为x[li] | x[li+1] | - | x[ri]=pi. [输入] 第一行两个整数 n,m.接下来 m ...
- CentOS7查看网络的相关命令
转载自:https://www.linuxidc.com/Linux/2015-07/119555.htm 1.切换到超级用户 [Oscar@localhost 桌面]$ su root 2.查询可用 ...
- Python调用Google翻译
出自:http://blog.csdn.net/zhaoyl03/article/details/8830806 最近想动手做一个文档自动下载器,需要模拟浏览器的行为.虽然感觉思路上没有困难,但在技术 ...