[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 ...
随机推荐
- Python(2.7.6) 标准日志模块 - Logging Handler
Python 标准日志模块使用 Handler 控制日志消息写到不同的目的地,如文件.流.邮件.socket 等.除了StreamHandler. FileHandler 和 NullHandler ...
- Linux命令行程序和内建指令
摘录百度分类 文件系统 cat cd chmod chown chgrp cksum cmp cp du df fsck fuser ln ls lsattr lsof mkdir mount mv ...
- 获取文件sha1 值
单元 IdHashSHA申明 function GetFile_SHA1(const iFileName: String): String; //Checksum hash value for fir ...
- shell小程序
因此需要挑选学生,因此需要一个抓阄的程序:要求:1.执行脚本后,想去的同学输入英文名字全拼,产生随机数01-99之间的数字,数字越大就去参加项目实践,前面已经抓到的数字,下次不能在出现相同数字.2.第 ...
- ###g++编译器
点击查看Evernote原文. #@author: gr #@date: 2014-07-20 #@email: forgerui@gmail.com 对g++编译器不是特别熟悉,希望借此熟悉一下. ...
- ###Maintainable C++
点击查看Evernote原文. #@author: gr #@date: 2014-08-15 #@email: forgerui@gmail.com 记录一些标准规范.让自己的编码更可读,更可维护. ...
- Java使用Flying Saucer实现HTML代码生成PDF文档
1.需要的jar包:org.xhtmlrenderer.flying-saucer-pdf-itext5,Maven依赖如下: <dependency> <groupId>or ...
- javaee学习-新建servlet 直接返回html
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletExcepti ...
- HDU 1058 Humble Number
Humble Number Problem Description A number whose only prime factors are 2,3,5 or 7 is called a humbl ...
- iOS之RunTime浅谈
首先说一下什么是runtime:RunTime简称运行时.就是系统在运行的时候的一些机制,其中最主要的是消息机制.对于C语言,函数的调用 在编译的时候会决定调用哪个函数( C语言的函数调用请看这里 ) ...