POJ 1753 Flip Game (高斯消元 枚举自由变元求最小步数)
题意: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 (高斯消元 枚举自由变元求最小步数)的更多相关文章
- POJ 1753 Flip game ( 高斯消元枚举自由变量)
题目链接 题意:给定一个4*4的矩阵,有两种颜色,每次反转一个颜色会反转他自身以及上下左右的颜色,问把他们全变成一种颜色的最少步数. 题解:4*4的矩阵打表可知一共有四个自由变元,枚举变元求最小解即可 ...
- POJ 1681 Painter's Problem (高斯消元 枚举自由变元求最小的步数)
题目链接 题意: 一个n*n 的木板 ,每个格子 都 可以 染成 白色和黄色,( 一旦我们对也个格子染色 ,他的上下左右 都将改变颜色): 给定一个初始状态 , 求将 所有的 格子 染成黄色 最少需要 ...
- poj 1753 Flip Game 高斯消元
题目链接 4*4的格子, 初始为0或1, 每次翻转一个会使它四周的也翻转, 求翻转成全0或全1最少的步数. #include <iostream> #include <vector& ...
- POJ 1681 Painter's Problem(高斯消元+枚举自由变元)
http://poj.org/problem?id=1681 题意:有一块只有黄白颜色的n*n的板子,每次刷一块格子时,上下左右都会改变颜色,求最少刷几次可以使得全部变成黄色. 思路: 这道题目也就是 ...
- POJ 1681 高斯消元 枚举自由变元
题目和poj1222差不多,但是解法有一定区别,1222只要求出任意一解,而本题需要求出最少翻转次数.所以需要枚举自由变元,变元数量为n,则枚举的次数为1<<n次 #include < ...
- POJ 3185 The Water Bowls(高斯消元-枚举变元个数)
题目链接:http://poj.org/problem?id=3185 题意:20盏灯排成一排.操作第i盏灯的时候,i-1和i+1盏灯的状态均会改变.给定初始状态,问最少操作多少盏灯使得所有灯的状态最 ...
- poj1222 EXTENDED LIGHTS OUT 高斯消元||枚举
Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 8481 Accepted: 5479 Description In an ...
- POJ 1830 开关问题 高斯消元,自由变量个数
http://poj.org/problem?id=1830 如果开关s1操作一次,则会有s1(记住自己也会变).和s1连接的开关都会做一次操作. 那么设矩阵a[i][j]表示按下了开关j,开关i会被 ...
- A - The Water Bowls POJ - 3185 (bfs||高斯消元)
题目链接:https://vjudge.net/contest/276374#problem/A 题目大意:给你20个杯子,每一次操作,假设当前是对第i个位置进行操作,那么第i个位置,第i+1个位置, ...
随机推荐
- Android-Empty-Layout:展示不同类型的页面布局,用于视图是空的时候
Android-Empty-Layout:这个布局可以作用在Listview,Gridview,用于显示数据的是空的时候,可以提示友好的页面.这库可以显示页面出错,页面加载,页面是空. 加载的动画页面 ...
- mysql数据库连接池 手动编写
源码来源于http://www.toutiao.com/a6350448676050174209/,留存以供以后参考学习 先上一张项目托普图 然后分别列出各个文件的源码: MyPool.java(就是 ...
- 后缀树(Suffix Tree)
问题描述: 后缀树(Suffix Tree) 参考资料: http://www.cppblog.com/yuyang7/archive/2009/03/29 ...
- uva 10912
dp 记忆化搜索 #include <cstdio> #include <cstdlib> #include <cmath> #include <map> ...
- iOS开发 .framework的Optional(弱引用)和Required(强引用)区别
首先,参考文档:https://blog.stackmob.com/2013/03/objective-c-tip-of-the-month-optional-frameworks/ 强引用(Requ ...
- centos telnet --xinetd 服务
telnet由于是明文传输,所以安全起见最好不要用telnet服务.但是由于telnet是一个比较方便的远程工具,在windows上是自带 的不需要安装客户端即可使用.如果telnet设置的比较复杂, ...
- POJ 1928
#include <iostream> #include <algorithm> #define MAXN 3000 using namespace std; struct n ...
- JsRender系列demo(7)compline
<!DOCTYPE html> <html> <head> <script src="http://code.jquery.com/jquery.j ...
- hadoop2.2.0集群搭建与部署
原创文章,转载请注明: 转载自http://www.cnblogs.com/tovin/p/3818908.html 一.安装环境 1.系统环境 CentOS 6.4 2.集群机器节点ip 节点一i ...
- lintcode 中等题:digits counts 统计数字
题目 统计数字 计算数字k在0到n中的出现的次数,k可能是0~9的一个值 样例 例如n=12,k=1,在 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],我们发现 ...