POJ 1222 熄灯问题【高斯消元】
<题目链接>
题目大意:
有一个5*6的矩阵,每一位是0或者1。 没翻转一位,它的上下左右的数字也为改变。(0变成1,1变成0)。要把矩阵中所有的数都变成0。求最少翻转次数的方案,输出矩阵(需要翻转的地方用1表示,反则用0表示)。
解题分析:
利用高斯消元,把这30个开关想象成是30个方程,第i个开关状态对应于第i个方程的右边的值。左边的是所有能够影响到的开关的值。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std; const int N = ;
int a[N][N], ans[N];
int dx[] = { ,,,-, };
int dy[] = { ,,,,- };
int idx(int x, int y) { return (x - ) * + y; } void Gauss()
{
int i, j, k, l;
memset(ans, , sizeof(ans));
for (i = , j = ; i <= && j <= ; j++)
{
for (k = i; k <= ; k++)
if (a[k][j]) break; if (a[k][j])
{
for (l = ; l <= ; l++) swap(a[i][l], a[k][l]);
for (l = ; l <= ; l++) //debug从1开始(回代)
{
if (l != i && a[l][j])
for (k = ; k <= ; k++)
a[l][k] ^= a[i][k]; //高斯消元的^异或运算;
}
i++;
}
}
for (int j = ; j<i; j++) ans[j] = a[j][];
} int main()
{
int x, y, T, cas = ;
scanf("%d", &T);
while (T--)
{
memset(a, , sizeof(a));
for (int i = ; i <= ; i++)
for (int j = ; j <= ; j++)
{
scanf("%d", &a[idx(i, j)][]); //这里是将该矩阵按列线性存储
for (int k = ; k <= ; k++)
{
x = i + dx[k]; y = j + dy[k];
if (x> || y> || x< || y<) continue;
a[idx(i, j)][idx(x, y)] = ; //将这个点周围四个点全部置为1
}
} for (int i = ; i <= ; i++) a[i][i] = ;
Gauss();
printf("PUZZLE #%d\n", ++cas);
for (int i = ; i <= ; i++)
{
printf("%d ", ans[i]);
if (i % == ) printf("\n");
}
}
return ;
}
2018-08-08
POJ 1222 熄灯问题【高斯消元】的更多相关文章
- POJ 1830 开关问题 高斯消元,自由变量个数
http://poj.org/problem?id=1830 如果开关s1操作一次,则会有s1(记住自己也会变).和s1连接的开关都会做一次操作. 那么设矩阵a[i][j]表示按下了开关j,开关i会被 ...
- A - The Water Bowls POJ - 3185 (bfs||高斯消元)
题目链接:https://vjudge.net/contest/276374#problem/A 题目大意:给你20个杯子,每一次操作,假设当前是对第i个位置进行操作,那么第i个位置,第i+1个位置, ...
- POJ 1166 The Clocks 高斯消元 + exgcd(纯属瞎搞)
依据题意可构造出方程组.方程组的每一个方程格式均为:C1*x1 + C2*x2 + ...... + C9*x9 = sum + 4*ki; 高斯消元构造上三角矩阵,以最后一个一行为例: C*x9 = ...
- POJ 1830 开关问题 (高斯消元)
题目链接 题意:中文题,和上篇博客POJ 1222是一类题. 题解:如果有解,解的个数便是2^(自由变元个数),因为每个变元都有两种选择. 代码: #include <iostream> ...
- POJ 2065 SETI(高斯消元)
题目链接:http://poj.org/problem?id=2065 题意:给出一个字符串S[1,n],字母a-z代表1到26,*代表0.我们用数组C[i]表示S[i]经过该变换得到的数字.给出一个 ...
- Poj 2947 widget factory (高斯消元解同模方程)
题目连接: http://poj.org/problem?id=2947 题目大意: 有n种类型的零件,m个工人,每个零件的加工时间是[3,9],每个工人在一个特定的时间段内可以生产k个零件(可以相同 ...
- POJ 1753 Flip game ( 高斯消元枚举自由变量)
题目链接 题意:给定一个4*4的矩阵,有两种颜色,每次反转一个颜色会反转他自身以及上下左右的颜色,问把他们全变成一种颜色的最少步数. 题解:4*4的矩阵打表可知一共有四个自由变元,枚举变元求最小解即可 ...
- POJ 3532 Resistance(高斯消元+基尔霍夫定理)
[题目链接] http://poj.org/problem?id=3532 [题目大意] 给出n个点,一些点之间有电阻相连,求1~n的等效电阻 [题解] 有基尔霍夫定理:任何一个点(除起点和终点)发出 ...
- poj 1753 Flip Game 高斯消元
题目链接 4*4的格子, 初始为0或1, 每次翻转一个会使它四周的也翻转, 求翻转成全0或全1最少的步数. #include <iostream> #include <vector& ...
- POJ 1830 开关问题 [高斯消元XOR]
和上两题一样 Input 输入第一行有一个数K,表示以下有K组测试数据. 每组测试数据的格式如下: 第一行 一个数N(0 < N < 29) 第二行 N个0或者1的数,表示开始时N个开关状 ...
随机推荐
- 第14月第30天 svn 撤销ignore revert
1. 直接到被ignore的位置,执行: svn add <你被ignore的文件名> --no-ignore –no-ignore是取消忽略 如果是add目录,你可以: svn add ...
- HDU 2191 - 单调队列优化多重背包
题目: 传送门呀传送门~ Problem Description 急!灾区的食物依然短缺! 为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种 ...
- 使用css将图像居中
默认情况下,图像属于内联元素.这意味着它们与周围的文本一起流动.为使图像居中,我们应该将其转换成块级元素,通过将display属性的值设置为block就可以完成转换. <html> < ...
- 编写灵活、稳定、高质量的 css代码的规范
语法 用两个空格来代替制表符(tab) -- 这是唯一能保证在所有环境下获得一致展现的方法. 为选择器分组时,将单独的选择器单独放在一行. 为了代码的易读性,在每个声明块的左花括号前添加一个空格. 声 ...
- POI导出带格式的Excel模板——(六)
Jar包
- char *与const char **函数参数传参问题
传参方法 ## 函数 extern void f2 ( const char ** ccc ); const char ch = 'X'; char * ch_ptr; const char ** c ...
- windows下caffe GPU版本配置
由于项目需要,所以在自己本子上配置了一下windows下GPU版本的caffe; 硬件: win10 ; gtx1070独显(计算能力6.1): 安装软件: cudnn-8. ...
- springboot系列十三、springboot集成swaggerUI
一.Swagger介绍 Swagger能成为最受欢迎的REST APIs文档生成工具之一,有以下几个原因: Swagger 可以生成一个具有互动性的API控制台,开发者可以用来快速学习和尝试API. ...
- mysql系列四、mySQL四舍五入函数用法总结
一.MySQL四舍五入函数ROUND(x) ROUND(x)函数返回最接近于参数x的整数,对x值进行四舍五入. 实例: 使用ROUND(x)函数对操作数进行四舍五入操作.SQL语句如下: mysql& ...
- centos下常用文件管理命令
fdisk d 删除分区 n:新建一个分区 p:列出已有分区 t:调整分区ID l:列出内核支持的分区id w:保存退出 q:不保存退出 ...