POJ 1753 (开关问题+高斯消元法)
题目链接: http://poj.org/problem?id=1753
题目大意:一堆格子,或白或白。每次可以把一个改变一个格子颜色,其上下左右四个格子颜色也改变。问最后使格子全部白或全部黑,求最小改变的格子树。
解题思路:
与POJ 1681 类似。不过这次是或黑或白,要初始化两次相反的解向量,
进行两次高斯消元,取其中小的值。
特殊的是,本题中有自由变元的存在,也就是说这个格子可黑可白,对结果没有影响。
这时候就会存在无穷解。其实POJ 1681也可能存在自由变元,不过数据略水,没处理也能A掉。
如果不对自由变元处理,那么我们只会处理一种解,所以某些情况答案是不对的。
自由变元的处理变化参照模板,渣渣暂时看不懂。
#include "cstdio"
#include "iostream"
#include "cstring"
using namespace std;
int ratio[][],mat[],freex[],x[],dir[][]={,,-,,,,,-,,},T,n;
void reset()
{
for(int i=;i<n;i++)
for(int j=;j<n;j++)
for(int k=;k<;k++)
{
int x=i+dir[k][],y=j+dir[k][];
if(x>=&&y>=&&x<n&&y<n) ratio[i*n+j][x*n+y]=;
}
}
int gauss()
{
int i,j,k,num=;
for(i=,j=;i<n*n&&j<n*n;i++,j++)
{
k=i;
for(;k<n*n;k++)
if(ratio[k][j]) break;
for(int t=j;t<=n*n;t++)
if(i!=k) swap(ratio[i][t],ratio[k][t]);
if(!ratio[i][j]) {i--;freex[num++]=j;continue;}
for(k=i+;k<n*n;k++)
{
if(ratio[k][j])
for(int t=j;t<=n*n;t++)
ratio[k][t]^=ratio[i][t];
}
}
k=i;
for(i=k; i<n*n; i++)
if(ratio[i][n*n]) return -;
int bit=<<(n*n-k),ans=0x3f3f3f3f;
for(int t=;t<bit;t++)
{
int cnt=,index=t;
for(j=;j<n*n-k;j++)
{
x[freex[j]]=(index&);
if(x[freex[j]]) cnt++;
index>>=;
}
for(i=k-; i>=; i--)
{
int tmp=ratio[i][n*n];
for(j=i+; j<n*n; j++)
if(ratio[i][j]) tmp^=x[j];
x[i]=tmp;
if(x[i]) cnt++;
}
ans=min(ans,cnt);
}
return ans;
}
int main()
{
//freopen("in.txt","r",stdin);
char c[];n=;
int ans=0x3f3f3f3f;
reset();
for(int i=; i<n; i++)
{
scanf("%s",&c);
for(int j=;j<n;j++)
{
if(c[j]=='w') {ratio[i*+j][n*n]=;mat[i*+j]=;}
if(c[j]=='b') {ratio[i*+j][n*n]=;mat[i*+j]=;}
}
}
int ok=gauss();
if(ok!=-) ans=min(ans,ok);
memset(ratio,,sizeof(ratio));
memset(freex,,sizeof(freex));
memset(x,,sizeof(x));
for(int i=;i<n*n;i++) ratio[i][n*n]=mat[i];
reset();
ok=gauss();
if(ok!=-) ans=min(ans,ok);
if(ans==0x3f3f3f3f) printf("Impossible\n");
else printf("%d\n",ans); }
| 13602643 | neopenx | 1753 | Accepted | 160K | 16MS | C++ | 2170B | 2014-11-05 18:35:15 |
POJ 1753 (开关问题+高斯消元法)的更多相关文章
- POJ 1222 (开关问题+高斯消元法)
题目链接: http://poj.org/problem?id=1222 题目大意:一堆开关,或开或关.每个开关按下后,周围4个方向开关反转.问使最后所有开关都关闭的,开关按法.0表示不按,1表示按. ...
- POJ 1681 (开关问题+高斯消元法)
题目链接: http://poj.org/problem?id=1681 题目大意:一堆格子,或白或黄.每次可以把一个改变一个格子颜色,其上下左右四个格子颜色也改变.问最后使格子全部变黄,最少需要改变 ...
- POJ 1753. Flip Game 枚举or爆搜+位压缩,或者高斯消元法
Flip Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 37427 Accepted: 16288 Descr ...
- POJ 1222 POJ 1830 POJ 1681 POJ 1753 POJ 3185 高斯消元求解一类开关问题
http://poj.org/problem?id=1222 http://poj.org/problem?id=1830 http://poj.org/problem?id=1681 http:// ...
- poj 1753 2965
这两道题类似,前者翻转上下左右相邻的棋子,使得棋子同为黑或者同为白.后者翻转同行同列的所有开关,使得开关全被打开. poj 1753 题意:有一4x4棋盘,上面有16枚双面棋子(一面为黑,一面为白), ...
- POJ 1753 Flip Game(高斯消元+状压枚举)
Flip Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 45691 Accepted: 19590 Descr ...
- [ACM训练] 算法初级 之 基本算法 之 枚举(POJ 1753+2965)
先列出题目: 1.POJ 1753 POJ 1753 Flip Game:http://poj.org/problem?id=1753 Sample Input bwwb bbwb bwwb bww ...
- 枚举 POJ 1753 Flip Game
题目地址:http://poj.org/problem?id=1753 /* 这题几乎和POJ 2965一样,DFS函数都不用修改 只要修改一下change规则... 注意:是否初始已经ok了要先判断 ...
- 穷举(四):POJ上的两道穷举例题POJ 1411和POJ 1753
下面给出两道POJ上的问题,看如何用穷举法解决. [例9]Calling Extraterrestrial Intelligence Again(POJ 1411) Description A mes ...
随机推荐
- MyEclipse生成WAR包并在Tomcat下部署发布(转发)
从来没有想过web项目还能打包的,但是有要求,就不得不去实现,在网上找了一下,发现挺简单的. 首先是使用MyEclipse将web项目打包,如下图所示. 右键选中项目,选择export. 然后选择J2 ...
- logstash之multiline插件,匹配多行日志
在外理日志时,除了访问日志外,还要处理运行时日志,该日志大都用程序写的,比如log4j.运行时日志跟访问日志最大的不同是,运行时日志是多行,也就是说,连续的多行才能表达一个意思. 在filter中,加 ...
- AXURE在原型设计中的应用
转: http://uedc.163.com/2248.html 前言 什么是原型呢? 产品原型简单的说就是产品设计成形之前的一个简单框架,对网站来讲,就是将页面模块.元素进行粗放式的排版和布局,深入 ...
- Delphi编程建议遵守的规范1---缩进、各种语句的用法
在编程时候,尤其是在一个大的团队里面,遵守统一的编程规范是极其重要的.为所有的开发人员制定一个源代码书写标准,以及程序和文件的命名标准,使他们在编程时有一致的格式,这样,每个编程人员编写的代码能够被其 ...
- Snowflake Snow Snowflakes(哈希表的应用)
Snowflake Snow Snowflakes Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 27312 Accep ...
- poj 1195:Mobile phones(二维线段树,矩阵求和)
Mobile phones Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 14391 Accepted: 6685 De ...
- TCP 连接中断的判断
关于TCP 3次握手,4次分手就不多说了.如何判断TCP连接是否中断是个大问题. 1 TCPKeep-alive 机制 并不是TCP 规范的一部分,实现细节差距大. 2 使用heartbeat 检测 ...
- hdu 4274 2012长春赛区网络赛 树形dp ***
设定每个节点的上限和下限,之后向上更新,判断是否出现矛盾 #include<cstdio> #include<iostream> #include<algorithm&g ...
- hdu 4070 福州赛区网络赛J 贪心 ***
优先发路程最长的 #include<cstdio> #include<iostream> #include<algorithm> #include<cstri ...
- 如何更快的删除String中的空格[未完]
背景:此文章主要源于网址[1]所描述的,文中大部分方法亦是[1]中实现的. 下面介绍集中删除空格的方法: 方法1:按空格分割后再拼接 /// <summary> /// 按空格分割后拼 ...