题目链接

题意:4*4的黑白棋,求把棋全变白或者全变黑的最小步数。

分析:以前用状态压缩做过。 和上题差不多,唯一的不同是这个终态是黑棋或者白棋,

但是只需要把给的初态做不同的两次处理就行了。

感觉现在还只是会套模板,不能独立的思考,好伤心。。。。

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#define LL __int64
const int maxn = +;
const int INF = <<;
using namespace std;
int equ, var, fn;
int a[maxn][maxn], x[maxn];
int free_x[maxn];
int gcd(int a, int b)
{
return b==?a:gcd(b, a%b);
}
int lcm(int a, int b)
{
return a*b/gcd(a, b);
}
int Gauss()
{
int x_mo;
x_mo = ;
int i, j, k, max_r, col;
int ta, tb, LCM, fx_num = ;
col = ; for(k = ; k<equ && col<var; k++, col++)
{
max_r = k;
for(i = k+; i < equ; i++)
if(abs(a[i][col])>abs(a[max_r][col]))
max_r = i; if(max_r != k)
for(j = k; j < var+; j++)
swap(a[k][j], a[max_r][j]); if(a[k][col]==)
{
free_x[fx_num++] = col; //求自由变元所在的列
k--;
continue;
}
for(i = k+; i < equ; i++)
{
if(a[i][col] != )
{
LCM = lcm(abs(a[i][col]), abs(a[k][col]));
ta = LCM/abs(a[i][col]);
tb= LCM/abs(a[k][col]);
if(a[i][col]*a[k][col] < ) tb = -tb; for(j = col; j < var+; j++)
a[i][j] = ((a[i][j]*ta - a[k][j]*tb)%x_mo+x_mo)%x_mo;
}
}
}
for(i = k; i < equ; i++)
if(a[i][col] != )
return INF; int stat=<<(var-k);
int res=INF;
for(i=; i<stat; i++)
{
int cnt=;
int 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;
} void init()
{
int i, j, tmp;
memset(a, , sizeof(a));
memset(x, , sizeof(x));
for(i = ; i < ; i++)
for(j = ; j < ; j++)
{
tmp = i*+j;
a[tmp][tmp] = ;
if(j<=-)
a[tmp+][tmp] = ;
if(j>=)
a[tmp-][tmp] = ;
if(tmp+<*)
a[tmp+][tmp] = ;
if(tmp->=)
a[tmp-][tmp] = ;
}
}
int main()
{
int i, j, ans;
char s[maxn][maxn];
while(~scanf("%s", s[]))
{
equ = ;
var = ;
for(i = ; i < ; i++)
{
getchar();
scanf("%s", s[i]);
}
init();
for(i = ; i < ; i++)
for(j = ; j < ; j++)
{
if(s[i][j]=='b') a[i*+j][] = ;
else a[i*+j][] = ;
}
fn = Gauss(); init();
for(i = ; i < ; i++)
for(j = ; j < ; j++)
{
if(s[i][j]=='w') a[i*+j][] = ;
else a[i*+j][] = ;
}
int fn2 = Gauss();
if(fn==INF&&fn2==INF)
printf("Impossible\n"); else
{
ans = min(fn, fn2);
printf("%d\n", ans);
}
}
return ;
}

POJ 1753 Flip Game (高斯消元 枚举自由变元求最小步数)的更多相关文章

  1. POJ 1753 Flip game ( 高斯消元枚举自由变量)

    题目链接 题意:给定一个4*4的矩阵,有两种颜色,每次反转一个颜色会反转他自身以及上下左右的颜色,问把他们全变成一种颜色的最少步数. 题解:4*4的矩阵打表可知一共有四个自由变元,枚举变元求最小解即可 ...

  2. POJ 1681 Painter's Problem (高斯消元 枚举自由变元求最小的步数)

    题目链接 题意: 一个n*n 的木板 ,每个格子 都 可以 染成 白色和黄色,( 一旦我们对也个格子染色 ,他的上下左右 都将改变颜色): 给定一个初始状态 , 求将 所有的 格子 染成黄色 最少需要 ...

  3. poj 1753 Flip Game 高斯消元

    题目链接 4*4的格子, 初始为0或1, 每次翻转一个会使它四周的也翻转, 求翻转成全0或全1最少的步数. #include <iostream> #include <vector& ...

  4. POJ 1681 Painter's Problem(高斯消元+枚举自由变元)

    http://poj.org/problem?id=1681 题意:有一块只有黄白颜色的n*n的板子,每次刷一块格子时,上下左右都会改变颜色,求最少刷几次可以使得全部变成黄色. 思路: 这道题目也就是 ...

  5. POJ 1681 高斯消元 枚举自由变元

    题目和poj1222差不多,但是解法有一定区别,1222只要求出任意一解,而本题需要求出最少翻转次数.所以需要枚举自由变元,变元数量为n,则枚举的次数为1<<n次 #include < ...

  6. POJ 3185 The Water Bowls(高斯消元-枚举变元个数)

    题目链接:http://poj.org/problem?id=3185 题意:20盏灯排成一排.操作第i盏灯的时候,i-1和i+1盏灯的状态均会改变.给定初始状态,问最少操作多少盏灯使得所有灯的状态最 ...

  7. poj1222 EXTENDED LIGHTS OUT 高斯消元||枚举

    Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 8481   Accepted: 5479 Description In an ...

  8. POJ 1830 开关问题 高斯消元,自由变量个数

    http://poj.org/problem?id=1830 如果开关s1操作一次,则会有s1(记住自己也会变).和s1连接的开关都会做一次操作. 那么设矩阵a[i][j]表示按下了开关j,开关i会被 ...

  9. A - The Water Bowls POJ - 3185 (bfs||高斯消元)

    题目链接:https://vjudge.net/contest/276374#problem/A 题目大意:给你20个杯子,每一次操作,假设当前是对第i个位置进行操作,那么第i个位置,第i+1个位置, ...

随机推荐

  1. bndtools教程

    使用工具编程的确能给人们带来很多便利,但是在不会用之前,且缺乏相应的中文资料让你去了解时,真是一种折磨,同时也是一种挑战. bndTools其实就是用来开发OSGi的一个工具,它为开发提供了便利,具体 ...

  2. usb口外接了Com设备,U盘识别不了问题

    就如本题,当我usb口外接了Com设备时候,再插入U盘会出现识别不了的问题. 解决方法非常的简单,只要拨出这个com设备的usb就可以使用U盘了^_^

  3. 3529: [Sdoi2014]数表 - BZOJ

    Description 有一张N×m的数表,其第i行第j列(1 < =i < =n,1 < =j < =m)的数值为能同时整除i和j的所有自然数之和.给定a,计算数表中不大于a ...

  4. K短路

    K短路 用dijsktra+A*启发式搜索当点v第K次出堆的时候,这时候求得的路径是k短路.A*算法有一个启发式函数f(p)=g(p)+h(p), 即评估函数=当前值+当前位置到终点的最短距离g(p) ...

  5. [转载]C# Double toString保留小数点方法

    有时候double型数据需要toString(),但又想保留小数,当值为整数,比如3.00时tostring后会变为”3″,具体说明见下: 1 string str0 = i.ToString(&qu ...

  6. 【C# 反射泛型】

    C# 反射泛型 摘自:http://www.itwis.com/html/net/c/20110411/10175.html C#泛型反射和普通反射的区别,泛型反射和普通反射的区别就是泛型参数的处理上 ...

  7. 【锋利的JQuery-学习笔记】输入框提示语-隐藏/显示

    html <div class="search"> <input type="text" id="inputSearch" ...

  8. 关于make: *** No rule to make target `clean'. Stop.的解决

    在重新编译makefile工程文件时需要用到 #make clean 命令, 但是最近工程使用make clean的时候总是提示: make: *** No rule to make target ` ...

  9. 【面试题030】最小的k个数

    [面试题030]最小的k个数 题目:     输入n个整数,找出其中最小的k个数.     例如输入4.5.1.6.2.7.3.8这8个字,则其中最小的4个数字是1.2.3.4.     思路一:   ...

  10. mutable关键字

    mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词.在C++中,mutable也是为了突破const的限制而设置的.被mutable修饰的变量(muta ...