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的板子,每次刷一块格子时,上下左右都会改变颜色,求最少刷几次可以使得全部变成黄色. 思路: 这道题目也就是 ...
随机推荐
- 动手动脑之小程序:TryAndCatch
源代码 import java.util.InputMismatchException;import java.util.Scanner;public class TryAndCatch {publi ...
- tableView 局部刷新
//一个section刷新 NSIndexSet *indexSet=[[NSIndexSet alloc]initWithIndex:2]; [tableview reloadSections:in ...
- Android Programming: Pushing the Limits -- Chapter 1: Fine-Tuning Your Development Environment
ADB命令 Application Exerciser Monkey Gradle ProGuard 代码重用 版本控制 静态代码分析 代码重构 开发者模式 ADB命令: @.adb help:查 ...
- EF学习 笔记-----EF映射
http://www.cnblogs.com/guomingfeng/archive/2013/06/15/mvc-ef-configuration-migration.html EF flountA ...
- 查看Linux分区格式
第一种方法: 使用mount [root@ol6-121-rac1 ~]# mount /dev/mapper/vg_ol6121rac1-lv_root on / type ext4 (rw) ...
- SSAS Cube 维度成员关系Rigid 和 Flexible
维度成员关系指示成员关系是否随时间而更改. 值为 Rigid 和 Flexible,前者表示成员之间的关系不随时间而更改,后者表示成员之间的关系随时间而更改. 默认值为 Flexible. 指定适 ...
- slf4i + logback 配置
一.所需jar包: slf4j-api-1.6.1.jar logback-classic-0.9.24.jar logback-core-0.9.24.jar 二.logback.xml配置示例: ...
- jq获取鼠标位置
jq获取鼠标位置 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- 快速熟悉python 下使用mysql(MySQLdb)
首先你需要安装上mysql和MySQLdb模块(当然还有其他模块可以用),这里我就略过了,如果遇到问题自行百度(或者评论在下面我可以帮忙看看) 这里简单记录一下自己使用的学习过程: 一.连接数据库 M ...
- 自己制作QQ空间音乐的具体方法
1.打开QQ邮箱找到左栏下方的“文件中转站”--点击收藏文件--上传到收藏 将MP3或WMA音乐文件上传 上传完成点下载 下图: 2.点“保存”将最上面一排的地址全部复制 下图 3.为了更 ...