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 ...
随机推荐
- Loadrunner之API测试
//API函数 web_submit_data web_custom_request //支持https请求 web_set_sockets_option("SSL_VERSION&qu ...
- php常用判断的函数
empty($var) //用来检查变量是否为空(没有值或零值) isset($var) //这个//测试一个变量看它是否已被定义. gettype($var) ...
- JS window.open()属性
一. Window 对象 Window 对象是 JavaScript 层级中的顶层对象. Window 对象代表一个浏览器窗口或一个框架. Window 对象会在 <body> 或 < ...
- Android Programming: Pushing the Limits -- Chapter 3: Components, Manifests, and Resources
Android Components Manifest文件 Resource and Assets v\:* {behavior:url(#default#VML);} o\:* {behavior: ...
- IIS网站发布若干问题
1.Win7 64位 IIS未能加载文件或程序集"System.Data.SQLite"或它的某一个依赖项 未能加载文件或程序集"System.Data.SQLite ...
- C#动态方法调用
此篇将介绍C#如何在运行时动态调用方法.当某些类型是运行时动态确定时,编译时的静态编码是无法解决这些动态对象或类的方法调用的.此篇则给你一把利剑,让动态对象的方法调用成为可能. 1.动态调用dll里的 ...
- [译] Extending jQuery Part1 Simple extensions
本章包含: JQuery 的起源和目标. 你能扩展JQuery 的那些部分. JQuery 扩展的实例. 如今,JQuery 已经是网络上最受欢迎的JavaScript Library. 1.1 jQ ...
- php判断访问的当前设备是手机还是电脑
<?php function isMobile(){ $useragent=isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AG ...
- phpMailer在thinkPHP框架中邮件发送
资源下载地址:http://pan.baidu.com/s/1c0kAoeO 提取码:ry5v 关键代码:application/Common/Common/funciton.php <?php ...
- Eclipse的详细安装步骤
第一种:这个方法是在线安装的 第二种:下载完整免安装包 首先打开网址:http://www.eclipse.org/ 然后在这里我就选择64位的安装,就以安装安卓开发的举例: 然后下载即可: