POJ 1681 (开关问题+高斯消元法)
题目链接: http://poj.org/problem?id=1681
题目大意:一堆格子,或白或黄。每次可以把一个改变一个格子颜色,其上下左右四个格子颜色也改变。问最后使格子全部变黄,最少需要改变几个格子。
解题思路:
与POJ 1222类似。
一共只有15*15个格子,设初始解向量黄为0,白为1.
对于每个开关,设其改变状态为x5,上下左右四个开关改变状态分别为x1,x2,x3,x4,
那么有方程x1^x2^x3^x4^x5^初始状态=0。
这样就有15*15个方程。解这15*15个线性方程组,就能得到每个格子的改变状态。
注意这里高斯消元的是一个开关矩阵,而不是黄白矩阵,也就是说,如果最后的解为0,不是表示这个格子为黄,而是这个格子相对于初始状态没有改变。
那么问题就来了,如何知道改变的最少格子?
其实很简单,在得到最终改变格子的状态后,统计一下里面的改变的格子数,也就是解为1的元,就是结果。
同时由于要判断无解情况,所以不能使用POJ 1222中那样的简略写法。
#include "cstdio"
#include "iostream"
#include "cstring"
using namespace std;
int ratio[][],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]=;
}
}
bool gauss()
{
int i,j,k;
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--;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 false;
for(i=k-; i>=; i--)
{
for(j=i+; j<n*n; j++)
ratio[i][n*n]^=(ratio[i][j]&ratio[j][n*n]);
}
return true;
}
int main()
{
//freopen("in.txt","r",stdin);
char c;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
memset(ratio,,sizeof(ratio));
reset();
for(int i=;i<n*n;i++)
{
scanf(" %c",&c);
if(c=='w') ratio[i][n*n]=;
if(c=='y') ratio[i][n*n]=;
}
int ans=gauss();
if(!ans) printf("inf\n");
else
{
int ans=;
for(int i=;i<n*n;i++)
if(ratio[i][n*n]==) ans++;
printf("%d\n",ans);
}
}
}
| 13597338 | neopenx | 1681 | Accepted | 364K | 16MS | C++ | 1651B | 2014-11-04 13:14:49 |
POJ 1681 (开关问题+高斯消元法)的更多相关文章
- POJ 1753 (开关问题+高斯消元法)
题目链接: http://poj.org/problem?id=1753 题目大意:一堆格子,或白或白.每次可以把一个改变一个格子颜色,其上下左右四个格子颜色也改变.问最后使格子全部白或全部黑,求最小 ...
- POJ 1222 (开关问题+高斯消元法)
题目链接: http://poj.org/problem?id=1222 题目大意:一堆开关,或开或关.每个开关按下后,周围4个方向开关反转.问使最后所有开关都关闭的,开关按法.0表示不按,1表示按. ...
- 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 - 1681: Painter's Problem (开关问题-高斯消元)
pro:开关问题,同上一题. 不过只要求输出最小的操作步数,无法完成输出“inf” sol:高斯消元的解对应的一组合法的最小操作步数. #include<bits/stdc++.h> #d ...
- OpenJudge 2813 画家问题 / Poj 1681 Painter's Problem
1.链接地址: http://bailian.openjudge.cn/practice/2813 http://poj.org/problem?id=1681 2.题目: 总时间限制: 1000ms ...
- poj 1830 开关问题
开关问题 题意:给n(0 < n < 29)开关的初始和最终状态(01表示),以及开关之间的关联关系(关联关系是单向的输入a b表示a->b),问有几种方式得到最终的状态.否则输出字 ...
- poj 1681 Painter's Problem
Painter's Problem 题意:给一个n*n(1 <= n <= 15)具有初始颜色(颜色只有yellow&white两种,即01矩阵)的square染色,每次对一个方格 ...
- POJ 1830 开关问题(高斯消元)题解
思路:乍一看好像和线性代数没什么关系.我们用一个数组B表示第i个位置的灯变了没有,然后假设我用u[i] = 1表示动开关i,mp[i][j] = 1表示动了i之后j也会跟着动,那么第i个开关的最终状态 ...
- POJ 1681 Painter's Problem(高斯消元+枚举自由变元)
http://poj.org/problem?id=1681 题意:有一块只有黄白颜色的n*n的板子,每次刷一块格子时,上下左右都会改变颜色,求最少刷几次可以使得全部变成黄色. 思路: 这道题目也就是 ...
随机推荐
- monkey测试
一.理解monkey测试 1.Monkey测试是Android自动化测试的一种手段.Monkey测试本身非常简单,就是模拟用户的按键输入,触摸屏输入,手势输入等,看设备多长时间会出异常. 2.当Mon ...
- 写了个简单的pdo的封装类
<?php class PD { //造对象 public $dsn = "mysql:dbname=test2;host=localhost"; //数据库类型,数据库名和 ...
- 重温WCF之数单向通讯、双向通讯、回调操作(五)
一.单向通讯单向操作不等同于异步操作,单向操作只是在发出调用的瞬间阻塞客户端,但如果发出多个单向调用,WCF会将请求调用放入到服务器端的队列中,并在某个时间进行执行.队列的存储个数有限,一旦发出的调用 ...
- Shell编程基础教程6--shell函数
6.shell函数 6.1.定义函数 简介: shell允许将一组命令集或语句形成一个可用块,这些块成为shell函数 定义函数的格式 ...
- POJ2778 DNA Sequence(AC自动机 矩阵)
先使用AC自动机求得状态转移关系,再建立矩阵,mat[i][j]表示一步可从i到j且i,j节点均非终止字符的方案数,则此矩阵的n次方表示n步从i,到j的方法数. #include<cstdio& ...
- android 入门-R文件的死与活
1.图片的名字Btn_Play R文件死了. 1.答:修改图片的名字btn_play R文件活了.
- iphone手机不同版本兼容、横竖屏
/* 兼容问题*/ @media screen and (device-width: 320px) and (device-height: 480px) and (-webkit-device-pix ...
- 总结之HashMap
前言:在上班途中使用博客园的客户端看了看文章,恰好两天之中看了同一个主题关于HashMap的两篇文章: http://www.cnblogs.com/chenssy/p/3521565.html ht ...
- 实现一种快速查找Richedit中可见区域内OLE对象的方法
Richedit是一个OLE容器,使用Richedit来显示IM聊天内容时,通常使用OLE对象来实现在Richedit中播放表情动画. 触发表情的绘制有两种途径: 1.来自Richedit的刷新消息. ...
- sql篇 select from where group by having order by
以前,自己总是记不住如何用group by,如何用order by,什么时候用group by,什么时候用order by,什么时候两者一起用,怎么用,谁先谁后,现在,我们就一起来说一下Select ...