[POJ1681]Painter's Problem(高斯消元,异或方程组,状压枚举)
题目链接:http://poj.org/problem?id=1681
题意:还是翻格子的题,但是这里有可能出现自由变元,这时候枚举一下就行。。(其实这题直接状压枚举就行)
/*
━━━━━┒ギリギリ♂ eye!
┓┏┓┏┓┃キリキリ♂ mind!
┛┗┛┗┛┃\○/
┓┏┓┏┓┃ /
┛┗┛┗┛┃ノ)
┓┏┓┏┓┃
┛┗┛┗┛┃
┓┏┓┏┓┃
┛┗┛┗┛┃
┓┏┓┏┓┃
┛┗┛┗┛┃
┓┏┓┏┓┃
┃┃┃┃┃┃
┻┻┻┻┻┻
*/
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cstring>
#include <climits>
#include <complex>
#include <cassert>
#include <cstdio>
#include <bitset>
#include <vector>
#include <deque>
#include <queue>
#include <stack>
#include <ctime>
#include <set>
#include <map>
#include <cmath>
using namespace std; const int maxn = ;
int equ, var;
int a[maxn][maxn];
int x[maxn];
int free_x[maxn];
int free_num; int gauss() {
int max_r, col, k;
free_num = ;
for(k = , col = ; k < equ && col < var; k++, col++) {
max_r = k;
for(int i = k + ; i < equ; i++) {
if(abs(a[i][col]) > abs(a[max_r][col]))
max_r = i;
}
if(a[max_r][col] == ) {
k--;
free_x[free_num++] = col;
continue;
}
if(max_r != k) {
for(int j = col; j < var + ; j++)
swap(a[k][j], a[max_r][j]);
}
for(int i = k + ; i < equ; i++) {
if(a[i][col] != ) {
for(int j = col; j < var + ; j++) {
a[i][j] ^= a[k][j];
}
}
}
}
for(int i = k; i < equ; i++) {
if(a[i][col] != )
return -;
}
if(k < var) return var - k;
for(int i = var - ; i >= ; i--) {
x[i] = a[i][var];
for(int j = i + ; j < var; j++) {
x[i] ^= (a[i][j] & x[j]);
}
}
return ;
} const int dx[] = {, , , , -};
const int dy[] = {, , -, , };
char G[][];
int tmp[][];
int n; bool ok(int x, int y) {
return x >= && x < n && y >= && y < n;
} int get(int x , int y) {
int c = G[x][y];
for(int i = ; i < ; i++) {
int xx = x + dx[i];
int yy = y + dy[i];
if(ok(xx, yy)) c += tmp[xx][yy];
}
return c % ;
} int calc() {
for(int i = ; i < n; i++) {
for(int j = ; j < n; j++) {
if(get(i-, j)) tmp[i][j] = ;
}
}
for(int i = ; i < n; i++) {
if(get(n-, i)) return -;
}
int p = ;
for(int i = ; i < n; i++) {
for(int j = ; j < n; j++) {
p += tmp[i][j];
}
}
return p;
} int solve(int t) {
n = t;
for(int i = ; i < n; i++) {
for(int j = ; j < n; j++) {
if(G[i][j] == 'w') G[i][j] = ;
else G[i][j] = ;
}
}
int ret = -;
int nn = << n;
for(int i = ; i < nn; i++) {
memset(tmp, , sizeof(tmp));
for(int j = ; j < n; j++) tmp[][n-j-] = i >> j & ;
int num = calc();
if(num >= && (ret < || ret > num)) ret = num;
}
return ret;
} int main() {
freopen("in", "r", stdin);
int T, _ = ;
scanf("%d", &T);
while(T--) {
scanf("%d", &var);
memset(a, , sizeof(a));
memset(x, , sizeof(x));
memset(free_x, , sizeof(free_x));
for(int i = ; i < var; i++) {
scanf("%s", G[i]);
}
int cnt = ;
for(int i = ; i < var; i++) {
for(int j = ; j < var; j++) {
if(G[i][j] == 'w') a[cnt][var*var] = ;
cnt++;
}
}
int t = var;
var = var * var;
equ = var;
for(int i = ; i < t; i++) {
for(int j = ; j < t; j++) {
int q = i * t + j;
a[q][q] = ;
if(i > ) a[(i-)*t+j][q] = ;
if(i < t - ) a[(i+)*t+j][q] = ;
if(j > ) a[i*t+j-][q] = ;
if(j < t - ) a[i*t+j+][q] = ;
}
}
// for(int i = 0; i < t; i++) {
// for(int j = 0; j < t; j++) {
// printf("%d ", a[i][j]);
// }
// printf("\n");
// }
int v = gauss();
if(v == -) puts("inf");
else if(v == ) {
int ret = ;
for(int i = ; i < var; i++) ret += x[i];
printf("%d\n", ret);
}
else {
int ret = solve(t);
if(ret < ) puts("inf");
else printf("%d\n", ret);
}
}
return ;
}
什么玩意,在发现有自由变元的时候,也求x的解不就好了,反正自由变元默认搞成0.
/*
━━━━━┒ギリギリ♂ eye!
┓┏┓┏┓┃キリキリ♂ mind!
┛┗┛┗┛┃\○/
┓┏┓┏┓┃ /
┛┗┛┗┛┃ノ)
┓┏┓┏┓┃
┛┗┛┗┛┃
┓┏┓┏┓┃
┛┗┛┗┛┃
┓┏┓┏┓┃
┛┗┛┗┛┃
┓┏┓┏┓┃
┃┃┃┃┃┃
┻┻┻┻┻┻
*/
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cstring>
#include <climits>
#include <complex>
#include <cassert>
#include <cstdio>
#include <bitset>
#include <vector>
#include <deque>
#include <queue>
#include <stack>
#include <ctime>
#include <set>
#include <map>
#include <cmath>
using namespace std; const int maxn = ;
int equ, var;
int a[maxn][maxn];
int x[maxn];
int free_x[maxn];
int free_num;
int ret; int gauss() {
int max_r, col, k;
free_num = ;
for(k = , col = ; k < equ && col < var; k++, col++) {
max_r = k;
for(int i = k + ; i < equ; i++) {
if(abs(a[i][col]) > abs(a[max_r][col]))
max_r = i;
}
if(a[max_r][col] == ) {
k--;
free_x[free_num++] = col;
continue;
}
if(max_r != k) {
for(int j = col; j < var + ; j++)
swap(a[k][j], a[max_r][j]);
}
for(int i = k + ; i < equ; i++) {
if(a[i][col] != ) {
for(int j = col; j < var + ; j++) {
a[i][j] ^= a[k][j];
}
}
}
}
for(int i = k; i < equ; i++) {
if(a[i][col] != )
return -;
}
// if(k < var) return var - k;
for(int i = var - ; i >= ; i--) {
x[i] = a[i][var];
for(int j = i + ; j < var; j++) {
x[i] ^= (a[i][j] & x[j]);
}
}
return ;
} char G[maxn][maxn]; int main() {
// freopen("in", "r", stdin);
int T, _ = ;
scanf("%d", &T);
while(T--) {
scanf("%d", &var);
memset(a, , sizeof(a));
memset(x, , sizeof(x));
memset(free_x, , sizeof(free_x));
for(int i = ; i < var; i++) {
scanf("%s", G[i]);
}
int cnt = ;
for(int i = ; i < var; i++) {
for(int j = ; j < var; j++) {
if(G[i][j] == 'w') a[cnt][var*var] = ;
cnt++;
}
}
int t = var;
var = var * var;
equ = var;
for(int i = ; i < t; i++) {
for(int j = ; j < t; j++) {
int q = i * t + j;
a[q][q] = ;
if(i > ) a[(i-)*t+j][q] = ;
if(i < t - ) a[(i+)*t+j][q] = ;
if(j > ) a[i*t+j-][q] = ;
if(j < t - ) a[i*t+j+][q] = ;
}
}
// for(int i = 0; i < t; i++) {
// for(int j = 0; j < t; j++) {
// printf("%d ", a[i][j]);
// }
// printf("\n");
// }
int v = gauss();
ret = ;
if(v == -) puts("inf");
else {
for(int i = ; i < var; i++) ret += x[i];
printf("%d\n", ret);
}
}
return ;
}
[POJ1681]Painter's Problem(高斯消元,异或方程组,状压枚举)的更多相关文章
- BZOJ.1923.[SDOI2010]外星千足虫(高斯消元 异或方程组 bitset)
题目链接 m个方程,n个未知量,求解异或方程组. 复杂度比较高,需要借助bitset压位. 感觉自己以前写的(异或)高斯消元是假的..而且黄学长的写法都不需要回代. //1100kb 324ms #i ...
- UVA11542 Square(高斯消元 异或方程组)
建立方程组消元,结果为2 ^(自由变元的个数) - 1 采用高斯消元求矩阵的秩 方法一: #include<cstdio> #include<iostream> #includ ...
- Tsinsen-A1488 : 魔法波【高斯消元+异或方程组】
高斯消元. 自己只能想出来把每一个点看成一个变量,用Xi表示其状态,这样必定TLE,n^2 个变量,再加上3次方的高斯消元(当然,可以用bitset压位). 正解如下: 我们把地图划分成一个个的横条和 ...
- UVa 11542 (高斯消元 异或方程组) Square
书上分析的太清楚,我都懒得写题解了.=_=|| #include <cstdio> #include <cstring> #include <cmath> #inc ...
- POJ 1681 Painter's Problem (高斯消元)
题目链接 题意:有一面墙每个格子有黄白两种颜色,刷墙每次刷一格会将上下左右中五个格子变色,求最少的刷方法使得所有的格子都变成yellow. 题解:通过打表我们可以得知4*4的一共有4个自由变元,那么我 ...
- POJ 1681 Painter's Problem [高斯消元XOR]
同上题 需要判断无解 需要求最小按几次,正确做法是枚举自由元的所有取值来遍历变量的所有取值取合法的最小值,然而听说数据太弱自由元全0就可以就水过去吧.... #include <iostream ...
- POJ.1830.开关问题(高斯消元 异或方程组)
题目链接 显然我们需要使每个i满足\[( ∑_{j} X[j]*A[i][j] ) mod\ 2 = B[i]\] 求这个方程自由元Xi的个数ans,那么方案数便是\(2^{ans}\) %2可以用^ ...
- UVA 11542 Square 高斯消元 异或方程组求解
题目链接:点击打开链接 白书的例题练练手. . . P161 #include <cstdio> #include <iostream> #include <algori ...
- poj 1681 Painter's Problem(高斯消元)
id=1681">http://poj.org/problem? id=1681 求最少经过的步数使得输入的矩阵全变为y. 思路:高斯消元求出自由变元.然后枚举自由变元,求出最优值. ...
- poj1830(高斯消元解mod2方程组)
题目链接:http://poj.org/problem?id=1830 题意:中文题诶- 思路:高斯消元解 mod2 方程组 有 n 个变元,根据给出的条件列 n 个方程组,初始状态和终止状态不同的位 ...
随机推荐
- less文件的样式无法生效的一个原因,通过WEB浏览器访问服务器less文件地址返回404错误
有一种情况容易导致less文件的样式无法生效,就是部分服务器(以IIS居多)会对未知后缀的文件返回404,导致无法正常读取.less文件.解决方案是在服务器中为.less文件配置MIME值为text/ ...
- pycharm如何调试scrapy
其实很简单,按下右上角的这个按钮 点击 跳出一个弹框 选择好 这三个基本就可以了 script是要运行的脚本即python中的Lib中的site-packages里面对应模块的执行文件(不懂的话,自行 ...
- Error -26612: HTTP Status-Code=500 (Internal Server Error) ...
造成HTTP-500错误,有朋友告诉我如下几个可能: 1.运行的用户数过多,对服务器造成的压力过大,服务器无法响应,则报HTTP500错误.减小用户数或者场景持续时间,问题得到解决. 2.该做关联的地 ...
- maven手动安装jar到本地仓库
比如oracle驱动ojdbc5.jar 1,安装MAVEN,并配置系统环境变量 2,将jar文件复制到d: 3,打开cmd窗口,cd到d: 4,执行命令:mvn install:install-fi ...
- weblogic .NoClassDefFoundError: Could not initialize class sun.awt.X11Graphi
这个是常见问题,可以通过增加Weblogic的启动参数来解决: -Djava.awt.headless=true 你可以修改 startWebLogic.sh 文件. export JAVA_OPTI ...
- PHP数组的一些常用函数
[数组排序]sort()低到高,rsort()高到低.保持键值对应关系使用 asort()和arsort().对键排序ksort()和krsort().随机排序 shuffle(). [数组key相关 ...
- UVA 12950 : Even Obsession(最短路Dijkstra)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- oracle数据库表空间文件收缩实例
Oracle数据文件收缩实例 数据文件的作用 HWM的基本概念 查看数据文件的使用情况 包括内容:数据文件大小,已经used空间,free空间,hwm信息 select /*+ ordered use ...
- hdwiki 的模板和标签
模版和标签 HDWiki模版标签可以让用户更方便.更容易的在页面中调用HDWiki的数据. HDWiki的三种标签:1.循环标签 {hdwiki:doclist...}{/hdwiki} ...
- oracle中的自动增长
create table test( id int not null primary key, name varchar2(20), sex int) ; create sequence t -> ...