[Gauss]POJ1753 Flip Game
题意:给4×4的棋盘的初始状态,b代表黑,w代表白。
要求变成全黑或者全白 最少需要几步。
简单的做法 可以暴搜 状压bfs 不再赘述
主要学习Gauss做法
同样是01方程组 用异或解
注意全黑或全白都可以
即 bbbb wwww
bbbb wwww
bbbb wwww
bbbb wwww 这两种的步数步数都是0.
因此我的做法是 列两个方程组分别求最小步数,再取最小值
int a[][]; // 增广矩阵
int b[][];
int x[]; // 解
int free_x[]; // 标记是否为自由未知量 int n;
void debug()
{
for(int i0=;i0<n*n;i0++)
{
for(int j0=;j0<n*n;j0++)
printf("%d ", a[i0][j0]);
printf("\n");
}
} int Gauss(int n, int m) // n个方程 m个未知数 即 n行m+1列
{
//转换为阶梯形式
int col=, k, num=;
for(k=;k<n && col<m;k++, col++)
{//枚举行
int max_r=k;
for(int i=k+;i<n;i++)//找到第col列元素绝对值最大的那行与第k行交换
if(abs(a[i][col])>abs(a[max_r][col]))
max_r=i;
if(max_r!=k)// 与第k行交换
for(int j=col;j<m+;j++)
swap(a[k][j], a[max_r][j]);
if(!a[k][col])// 说明该col列第k行以下全是0了
{
k--;
free_x[num++]=col;
continue;
}
for(int i=k+;i<n;i++)// 枚举要删除的行
if(a[i][col])
for(int j=col;j<m+;j++)
a[i][j]^=a[k][j];
} // debug();
// printf("%d %d\n", col, k); for(int i=k;i<n;i++)
if(a[i][col])
return -; // 无解 // if(k<m) //m-k为自由未知量个数
// {
int stat=<<(m-k);
int ans=INT_MAX;
for(int i=;i<stat;i++)
{
int cnt=;
for(int j=;j<m-k;j++)
if(i&(<<j))
{
x[free_x[j]]=;
cnt++;
}
else
x[free_x[j]]=;
for(int j=k-;j>=;j--)
{
int tmp;
for(tmp=j;tmp<m;tmp++)
if(a[j][tmp])
break;
x[tmp]=a[j][m];
for(int l=tmp+;l<m;l++)
if(a[j][l])
x[tmp]^=x[l];
cnt+=x[tmp];
}
if(cnt<ans)
ans=cnt;
}
return ans;
// } // // 唯一解 回代
// for(int i=m-1;i>=0;i--)
// {
// x[i]=a[i][m];
// for(int j=i+1;j<m;j++)
// x[i]^=(a[i][j] && x[j]);
// }
// int ans=0;
// for(int i=0;i<n*n;i++)
// ans+=x[i];
// return ans;
} void init()
{
n=;
memset(a, , sizeof(a));
memset(x, , sizeof(x));
for(int i=;i<n;i++)
for(int j=;j<n;j++)
{
int t=i*n+j;
a[t][t]=;
if(i>)
a[(i-)*n+j][t]=;
if(i<n-)
a[(i+)*n+j][t]=;
if(j>)
a[i*n+j-][t]=;
if(j<n-)
a[i*n+j+][t]=;
}
} int main()
{
char ch;
while(cin>>ch)
{
init();
a[][]=(ch=='b');
b[][]=(ch=='w');
for(int i=;i<;i++)
{
cin>>ch;
a[i][n*n]=(ch=='b');
b[i][n*n]=(ch=='w');
}
int t=Gauss(n*n, n*n);
if(t==-)
{
printf("Impossible\n");
continue ;
}
init();
for(int i=;i<;i++)
a[i][]=b[i][];
int tt=Gauss(n*n, n*n);
printf("%d\n", min(t, tt));
}
return ;
}
POJ 1753
[Gauss]POJ1753 Flip Game的更多相关文章
- poj1753 Flip Game(BFS+位压缩)
题目链接 http://poj.org/problem?id=1753 题意 一个棋盘上有16个格子,按4×4排列,每个格子有两面,两面的颜色分别为黑色和白色,游戏的每一轮选择一个格子翻动,翻动该格子 ...
- poj1753,Flip Game,ArrayDeque<Node>
Flip Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 30449 Accepted: 13232 Descr ...
- POJ1753 Flip Game(bfs、枚举)
链接:http://poj.org/problem?id=1753 Flip Game Description Flip game is played on a rectangular 4x4 fie ...
- poj1753 Flip Game
题意:4*4的正方形,每个格子有黑白两面,翻转格子使得4*4个格子显示全黑或全白,翻转要求:选中的那个格子,以及其上下左右相邻的格子(如果存在)要同时翻转.输出最小的达到要求的翻转次数或者Imposs ...
- [POJ1753]Flip Game(异或方程组,高斯消元,枚举自由变量)
题目链接:http://poj.org/problem?id=1753 题意:同上. 这回翻来翻去要考虑自由变元了,假设返回了自由变元数量,则需要枚举自由变元. /* ━━━━━┒ギリギリ♂ eye! ...
- POJ1753——Flip Game
Flip Game Description Flip game is played on a rectangular 4x4 field with two-sided pieces placed on ...
- POJ-1753 Flip Game---二进制枚举子集
题目链接: https://vjudge.net/problem/POJ-1753 题目大意: 有4*4的正方形,每个格子要么是黑色,要么是白色,当把一个格子的颜色改变(黑->白或者白-> ...
- POJ-1753 Flip Game (BFS+状态压缩)
Description Flip game is played on a rectangular 4x4 field with two-sided pieces placed on each of i ...
- POJ1753 Flip Game(位运算+暴力枚举)
Flip game is played on a rectangular 4x4 field with two-sided pieces placed on each of its 16 square ...
随机推荐
- JAXB - Annotations, Type Adapters: XmlJavaTypeAdapter
For some Java container types JAXB has no built-in mapping to an XML structure. Also, you may want t ...
- Android入门开发之销毁activity
使用: 销毁.关闭页面activity 如果打开下个页面的同时销毁了本页面,在下个页面无法返回本页面,每次打开APP应用就会先显示一张APP的介绍图.或者LOGO页面,延时几秒进入应用,进入后无法再返 ...
- php文件上传限制
PHP默认的上传限定是最大2M,想上传超过此设定的文件,需要调整PHP.apache等的一些参数.下面,我们简要介绍一下PHP文件上传涉及到的一些参数: file_uploads :是否允许通过HTT ...
- .bak文件在英文版的sqlserver2014如何生成和恢复
生成bak备份文件 1.选择数据库 2.右击选择task 3.选择backup 4.
- 批量转换word文档到pdf文件
最近在整理每周的工作记录.因为每周的工作记录大都是单独的word文件,有时候忘记了也不容易找出来,一个个打开查找太费劲,因此想着把这些文件通过word2016的另存为功能转换为pdf,然后永Acrob ...
- CPrintDialog
CPrintDialog 封装windows为打印提供服务的通用窗体. BOOL GetDefaults(); //获取默认设备,不显示对话框 // Helpers for parsing infor ...
- ios专题 - objc runtime 动态增加属性
objective-c中,有类别可以在不修改源码的基础上增加方法:近排在看别人的开源代码时,发现还可以动态增加属性.而且是在运行时,太牛B了. 使用运行时库,必须要先引入 objc/runtime.h ...
- Android基础之Activity
一.什么是Activity Activity是Android四大组件之一,并且Activity是组件中的重中之重. Activity是为用户提供一个用于信息交互的窗口. 二.如何去创建Activity ...
- centos下如何用SMplayer播放WMV格式文件
安装的是centos6.6,想用来做桌面系统使用!! 装完后,其他的办公软件都安装好了.但是,视频播放却出问题了. 配置的yum安装的SMplayer播放器,播放其他的视频文件没问题,就是WMV的视频 ...
- 通过 ANE(Adobe Native Extension) 启动Andriod服务 推送消息(五)
这一节,用个简单的例子来调用下之前生成的service.ane 首先建一个flex手机项目 然后在构建路径中把ane引进来 可以看到此ane支持Android平台. serviceMobile.mxm ...