「ZOJ 1354」Extended Lights Out「高斯消元」
题意:给定一个\(5\times 6\)的棋盘的\(01\)状态,每次操作可以使它自己和周围四个格子状态取反,求如何操作,输出一个\(01\)矩阵
题解:这题可以通过枚举第一行的状态然后剩下递推来做,但是这里还是写一种好理解的高斯消元解异或方程组的方法。
对于每个格子列一个方程,未知数就是要求的答案矩阵,系数的话把它周围的设为1,其他设为0。然后右边的常数项为它本来的状态。然后就高斯消元嘛。
我用了bitset优化,实际上可能unsigned int或者long long也可以。
#include <algorithm>
#include <bitset>
#include <cstdio>
using namespace std;
const int n = 5;
const int m = 6;
const int N = 34;
const int dx[] = {0, 1, 0, -1, 0};
const int dy[] = {0, 0, 1, 0, -1};
int f[N];
bitset<N> a[N];
int pos(int x, int y) {
return (x - 1) * m + y;
}
void gauss(int n) {
for(int i = 1, j; i <= n; i ++) {
for(int k = i; k <= n; k ++) if(a[k][i]) j = k, k = n;
if(i != j) swap(a[i], a[j]);
for(j = i + 1; j <= n; j ++) if(a[j][i]) a[j] ^= a[i];
}
for(int i = n - 1; i >= 1; i --)
for(int j = i + 1; j <= n; j ++)
if(a[j][n + 1] && a[i][j]) a[i][n + 1] = !a[i][n + 1];
}
int main() {
int test; scanf("%d", &test);
for(int t = 1; t <= test; t ++) {
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= m; j ++)
scanf("%d", &f[pos(i, j)]);
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= m; j ++) {
int p = pos(i, j); a[p].reset();
a[p][n * m + 1] = f[p];
for(int k = 0; k < 5; k ++) {
int x = i + dx[k], y = j + dy[k];
if(x >= 1 && x <= n && y >= 1 && y <= m) {
a[p][pos(x, y)] = 1;
}
}
}
gauss(n * m);
printf("PUZZLE #%d\n", t);
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= m; j ++)
printf("%d%c", (int) a[pos(i, j)][n * m + 1], " \n"[j == m]);
}
return 0;
}
「ZOJ 1354」Extended Lights Out「高斯消元」的更多相关文章
- uva 1560 - Extended Lights Out(枚举 | 高斯消元)
题目链接:uva 1560 - Extended Lights Out 题目大意:给定一个5∗6的矩阵,每一个位置上有一个灯和开关,初始矩阵表示灯的亮暗情况,假设按了这个位置的开关,将会导致周围包含自 ...
- POJ 1222 EXTENDED LIGHTS OUT(高斯消元解异或方程组)
EXTENDED LIGHTS OUT Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 10835 Accepted: 6 ...
- 【POJ】1222 EXTENDED LIGHTS OUT(高斯消元)
http://poj.org/problem?id=1222 竟然我理解了两天..... 首先先来了解异或方程组(或者说mod2方程组,modk的话貌似可以这样拓展出来) 对于一些我们需要求出的变量a ...
- [POJ1222]EXTENDED LIGHTS OUT(高斯消元,异或方程组)
题目链接:http://poj.org/problem?id=1222 题意:开关是四连通的,每按一个就会翻转自己以及附近的四个格(假如有).问需要翻转几个,使他们都变成关. 把每一个灯看作一个未知量 ...
- POJ 1222 EXTENDED LIGHTS OUT(高斯消元)
[题目链接] http://poj.org/problem?id=1222 [题目大意] 给出一个6*5的矩阵,由0和1构成,要求将其全部变成0,每个格子和周围的四个格子联动,就是说,如果一个格子变了 ...
- POJ 1222 EXTENDED LIGHTS OUT(高斯消元)题解
题意:5*6的格子,你翻一个地方,那么这个地方和上下左右的格子都会翻面,要求把所有为1的格子翻成0,输出一个5*6的矩阵,把要翻的赋值1,不翻的0,每个格子只翻1次 思路:poj 1222 高斯消元详 ...
- POJ 1222 EXTENDED LIGHTS OUT(高斯消元解XOR方程组)
http://poj.org/problem?id=1222 题意:现在有5*6的开关,1表示亮,0表示灭,按下一个开关后,它上下左右的灯泡会改变亮灭状态,要怎么按使得灯泡全部处于灭状态,输出方案,1 ...
- POJ1222EXTENDED LIGHTS OUT(高斯消元)
EXTENDED LIGHTS OUT Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 11815 Accepted: 7 ...
- LOJ 2542 「PKUWC2018」随机游走 ——树上高斯消元(期望DP)+最值反演+fmt
题目:https://loj.ac/problem/2542 可以最值反演.注意 min 不是独立地算从根走到每个点的最小值,在点集里取 min ,而是整体来看,“从根开始走到点集中的任意一个点就停下 ...
随机推荐
- 根据VM的TAG开停机
公有云一个非常大的优势,就是可以根据需求进行开停机.由于计费是按时进行的,从而实现节省成本. Azure上用脚本按时开停机已经有很多部署的案例.本文将介绍采用VM Tag中规定的时间进行开停机的脚本. ...
- Python学习笔记 - PostgreSQL的使用
一.安装PostgreSQL模块 pip install psycopg2 有时候会失败,多安装2次就好了(我是第二次成功了). 二.数据库连接接口 由于Python统一了数据库连接的接口,所以psy ...
- UEditor富文本编辑器的使用 http://fex.baidu.com/ueditor/
[转] http://fex.baidu.com/ueditor/ UEditor 介绍 UEditor 是由百度「FEX前端研发团队」开发的所见即所得富文本web编辑器,具有轻量,可定制,注重用户体 ...
- HDU1576(扩展欧几里得)
A/B Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- Git学习笔记(四)标签和搭建Git服务
一.标签是什么 发布一个版本时,我们通常先在版本库中打一个标签,这样,就唯一确定了打标签时刻的版本.将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来.所以,标签也是版本库的一 ...
- qt安装必要的库 qt开源安装包下载
yum install mesa-libGL-devel mesa-libGLU-devel #yum install freeglut-devel http://www.qt.io/download ...
- matlab读取excel
xlsread函数: x = xlsread('d:/min1.csv','B2:B10'); %文件名和路径:所读取的数据范围:
- 我积累的Java实用代码
1.解压zip文件 /** * 解压输入的zip流,Java默认的解压只能处理UTF-8编码的文件或者目录名,否则会报MALFORMED异常 * * @param is 输入流 * @param ou ...
- Android studio导入svn工程
Quick Start——> Check outproject from Version——> Subversion——> ‘+’加号 ——> 输入网址 ——> 注意选择 ...
- JAVA基础知识总结13(同步)
好处:解决了线程安全问题. 弊端:相对降低性能,因为判断锁需要消耗资源,还容易产生了死锁. 定义同步是有前提的: 1,必须要有两个或者两个以上的线程,才需要同步. 2,多个线程必须保证使用的是同一个锁 ...