题目链接:uva 1560 - Extended Lights Out

题目大意:给定一个5∗6的矩阵,每一个位置上有一个灯和开关,初始矩阵表示灯的亮暗情况,假设按了这个位置的开关,将会导致周围包含自己位置的灯状态变换。求一个按开关位置,保证全部灯都灭掉。

解题思路:

  1. 枚举,枚举第一行的状态,然后递推出后面四行的状态。
  2. 高斯消元,对于每一个位置对定变量,这样列出30个方程求解。
C++ 枚举
#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std;
const int maxn = 10;
const int R = 5;
const int C = 6; int arr[maxn][maxn], v[maxn][maxn], p[maxn][maxn]; bool judge (int s) {
memset(p, 0, sizeof(p));
memset(v, 0, sizeof(v)); for (int i = 0; i < C; i++) {
if (s&(1<<i)) {
p[1][i+1] = 1; for (int j = 0; j <= 2; j++)
v[1][i+j] ^= 1;
v[2][i+1] ^= 1;
}
} for (int i = 2; i <= R; i++) {
for (int j = 1; j <= C; j++)
if (v[i-1][j]^arr[i-1][j]) {
p[i][j] = 1; for (int k = -1; k <= 1; k++)
v[i][j+k] ^= 1;
v[i+1][j] ^= 1;
}
} for (int i = 1; i <= C; i++)
if (v[R][i]^arr[R][i])
return false; for (int i = 1; i <= R; i++) {
for (int j = 1; j < C; j++)
printf("%d ", p[i][j]);
printf("%d\n", p[i][C]);
}
return true;
} int main () {
int cas;
scanf("%d", &cas);
for (int kcas = 1; kcas <= cas; kcas++) { for (int i = 1; i <= R; i++)
for (int j = 1; j <= C; j++)
scanf("%d", &arr[i][j]); printf("PUZZLE #%d\n", kcas);
for (int s = 0; s < (1<<C); s++)
if (judge(s))
break;
}
return 0;
}
#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std;
const int dir[5][2] = {{0, 0}, {1, 0}, {-1, 0}, {0, 1}, {0, -1}};
const int maxn = 30;
const int R = 5;
const int C = 6;
typedef int Mat[maxn+5][maxn+5]; Mat A;
int v[R+5][C+5]; void init () {
memset(A, 0, sizeof(A));
memset(v, 0, sizeof(v));
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
int x = i * C + j;
scanf("%d", &A[x][maxn]);
for (int k = 0; k < 5; k++) {
int p = i + dir[k][0];
int q = j + dir[k][1];
if (p < 0 || p >= R || q < 0 || q >= C)
continue;
A[x][p*C+q] = 1;
}
}
}
} void gauss_elimination (Mat a, int n) { for (int i = 0; i < n; i++) { int r = i;
while (A[r][i] == 0)
r++; if (r != i) {
for (int j = 0; j <= n; j++)
swap(A[i][j], A[r][j]);
} for (int j = i + 1; j < n; j++) {
if (A[j][i]) {
for (int k = 0; k <= n; k++)
A[j][k] ^= A[i][k];
}
}
} for (int i = n - 1; i >= 0; i--) {
for (int j = i + 1; j < n; j++)
A[i][n] ^= (A[j][n] * A[i][j]);
if (A[i][n])
v[i/C][i%C] = 1;
}
} int main () {
int cas;
scanf("%d", &cas);
for (int kcas = 1; kcas <= cas; kcas++) {
init();
gauss_elimination(A, maxn);
printf("PUZZLE #%d\n", kcas);
for (int i = 0; i < R; i++) {
printf("%d", v[i][0]);
for (int j = 1; j < C; j++)
printf(" %d", v[i][j]);
printf("\n");
}
}
return 0;
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

uva 1560 - Extended Lights Out(枚举 | 高斯消元)的更多相关文章

  1. POJ 1222 EXTENDED LIGHTS OUT(高斯消元解异或方程组)

    EXTENDED LIGHTS OUT Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 10835   Accepted: 6 ...

  2. 「ZOJ 1354」Extended Lights Out「高斯消元」

    题意:给定一个\(5\times 6\)的棋盘的\(01\)状态,每次操作可以使它自己和周围四个格子状态取反,求如何操作,输出一个\(01\)矩阵 题解:这题可以通过枚举第一行的状态然后剩下递推来做, ...

  3. POJ 1222 EXTENDED LIGHTS OUT(高斯消元)

    [题目链接] http://poj.org/problem?id=1222 [题目大意] 给出一个6*5的矩阵,由0和1构成,要求将其全部变成0,每个格子和周围的四个格子联动,就是说,如果一个格子变了 ...

  4. POJ 1222 EXTENDED LIGHTS OUT(高斯消元)题解

    题意:5*6的格子,你翻一个地方,那么这个地方和上下左右的格子都会翻面,要求把所有为1的格子翻成0,输出一个5*6的矩阵,把要翻的赋值1,不翻的0,每个格子只翻1次 思路:poj 1222 高斯消元详 ...

  5. POJ 1222 EXTENDED LIGHTS OUT(高斯消元解XOR方程组)

    http://poj.org/problem?id=1222 题意:现在有5*6的开关,1表示亮,0表示灭,按下一个开关后,它上下左右的灯泡会改变亮灭状态,要怎么按使得灯泡全部处于灭状态,输出方案,1 ...

  6. 【POJ】1222 EXTENDED LIGHTS OUT(高斯消元)

    http://poj.org/problem?id=1222 竟然我理解了两天..... 首先先来了解异或方程组(或者说mod2方程组,modk的话貌似可以这样拓展出来) 对于一些我们需要求出的变量a ...

  7. [POJ1222]EXTENDED LIGHTS OUT(高斯消元,异或方程组)

    题目链接:http://poj.org/problem?id=1222 题意:开关是四连通的,每按一个就会翻转自己以及附近的四个格(假如有).问需要翻转几个,使他们都变成关. 把每一个灯看作一个未知量 ...

  8. bzoj千题计划187:bzoj1770: [Usaco2009 Nov]lights 燈 (高斯消元解异或方程组+枚举自由元)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1770 a[i][j] 表示i对j有影响 高斯消元解异或方程组 然后dfs枚举自由元确定最优解 #in ...

  9. POJ1222EXTENDED LIGHTS OUT(高斯消元)

    EXTENDED LIGHTS OUT Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 11815   Accepted: 7 ...

随机推荐

  1. Socket连接超时(转)

    Socket.connect连接超时有二种情况: 1.由于网络的问题,TCP/IP三次握手时间>timeout的设置时间.这在国外访问weibo时,并且网络环境极差的情况下有可能发生.解决的办法 ...

  2. HDU ACM 1065 I Think I Need a Houseboat

    分析:告诉协调的房子,每年(0,0)作为一个半圆区域的中心将被添加50.请教如何多年以来,这家的位置将是半圆内.注意pi必须采取3.1415926管辖权. #include<iostream&g ...

  3. Java 多线程编程两个简单的例子

    /** * @author gao */ package gao.org; public class RunnableDemo implements Runnable{ @Override publi ...

  4. Vijos.1096 津津储蓄计划

    见问题: https://vijos.org/p/1096 主题概述 津津的零花钱一直都是自己的管理.每月初的母亲津津300美元,津津将于本月支出预算.而且总是做同样的实际支出与预算.  为了让津津学 ...

  5. php异或加密解密算法的实现

    function xor_enc($str,$key) { $crytxt = ''; $keylen = strlen($key); for($i=0;$i<strlen($str);$i++ ...

  6. 光流和KLT

    一 光流 光流的概念是Gibson在1950年首先提出来的. 它是空间运动物体在观察成像平面上的像素运动的瞬时速度.是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存 ...

  7. leetcode 刷道题 70 earch Insert Position 二进制搜索插入位置

    Given a sorted array and a target value, return the index if the target is found. If not, return the ...

  8. rabbitMQ说明文档

    rabbitMQ是什么 RabbitMQ     是由     LShift     提供的一个     Advanced Message Queuing Protocol (AMQP)     的开 ...

  9. 64bit Centos6.4编hadoop-2.5.1

    64bit Centos6.4编hadoop-2.5.1   1.说明 a)       因为从apache下载下来的tar.gz包是用32 bit编译的,全部假设用Linux 64作为hadoop的 ...

  10. Oracle\MS SQL Server Update多表关联更新

    原文:Oracle\MS SQL Server Update多表关联更新 一条Update更新语句是不能更新多张表的,除非使用触发器隐含更新.而表的更新操作中,在很多情况下需要在表达式中引用要更新的表 ...