poj 1222 高斯消元

关灯游戏 Lights out (三)(线性代数+高斯消元,搜索全部解) 关灯游戏和线性代数联系紧密,对于一个 的灯阵,用线性方程组+高斯消元法求解,时间复杂度为O(m×n)^3。相对于首行枚举算法复杂度O(2^n) ,线代算法的时间复杂度低很多。用线性代数求解关灯游戏是个很不错的选择。         本文用最通俗的语言介绍线代求解关灯游戏原理。由于解释通俗化,细节之处难以严谨表述,说得不好的地方,请大神轻拍。 线性方程组求解关灯游戏的原理 问题: 阅读详情

EXTENDED LIGHTS OUT
Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 8353 Accepted: 5400

Description

In an extended version of the game Lights Out, is a puzzle with 5 rows of 6 buttons each (the actual puzzle has 5 rows of 5 buttons each). Each button has a light. When a button is pressed, that button and each of its (up to four) neighbors above, below, right and left, has the state of its light reversed. (If on, the light is turned off; if off, the light is turned on.) Buttons in the corners change the state of 3 buttons; buttons on an edge change the state of 4 buttons and other buttons change the state of 5. For example, if the buttons marked X on the left below were to be pressed,the display would change to the image on the right. 

The aim of the game is, starting from any initial set of lights on in the display, to press buttons to get the display to a state where all lights are off. When adjacent buttons are pressed, the action of one button can undo the effect of another. For instance, in the display below, pressing buttons marked X in the left display results in the right display.Note that the buttons in row 2 column 3 and row 2 column 5 both change the state of the button in row 2 column 4,so that, in the end, its state is unchanged. 

Note: 
1. It does not matter what order the buttons are pressed. 
2. If a button is pressed a second time, it exactly cancels the effect of the first press, so no button ever need be pressed more than once. 
3. As illustrated in the second diagram, all the lights in the first row may be turned off, by pressing the corresponding buttons in the second row. By repeating this process in each row, all the lights in the first 
four rows may be turned out. Similarly, by pressing buttons in columns 2, 3 ?, all lights in the first 5 columns may be turned off. 
Write a program to solve the puzzle.

Input

The first line of the input is a positive integer n which is the number of puzzles that follow. Each puzzle will be five lines, each of which has six 0 or 1 separated by one or more spaces. A 0 indicates that the light is off, while a 1 indicates that the light is on initially.

Output

For each puzzle, the output consists of a line with the string: "PUZZLE #m", where m is the index of the puzzle in the input file. Following that line, is a puzzle-like display (in the same format as the input) . In this case, 1's indicate buttons that must be pressed to solve the puzzle, while 0 indicate buttons, which are not pressed. There should be exactly one space between each 0 or 1 in the output puzzle-like display.

Sample Input

2
0 1 1 0 1 0
1 0 0 1 1 1
0 0 1 0 0 1
1 0 0 1 0 1
0 1 1 1 0 0
0 0 1 0 1 0
1 0 1 0 1 1
0 0 1 0 1 1
1 0 1 1 0 0
0 1 0 1 0 0

Sample Output

PUZZLE #1
1 0 1 0 0 1
1 1 0 1 0 1
0 0 1 0 1 1
1 0 0 1 0 0
0 1 0 0 0 0
PUZZLE #2
1 0 0 1 1 1
1 1 0 0 0 0
0 0 0 1 0 0
1 1 0 1 0 1
1 0 1 1 0 1

思路:

将它们之间的关系转化成方程组即可


/*
poj1222
类似于一元开关问题。把关系转化后,用Gauss求出
解集即可
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
typedef long double ld;

using namespace std;
const int maxn = 300;

int equ,var;
int a[maxn][maxn];
int x[maxn];
int free_x[maxn];
int free_num;

int Gauss()
{
    int max_r,col,k;
    free_num = 0;
    for(k = 0,col = 0; k < equ && col < var; k++,col++)
    {
        max_r = k;
        for(int i = k+1; i < equ; i++)
        {
            if(abs(a[i][col]) > abs(a[max_r][col]))
                max_r = i;
        }
        if(a[max_r][col] == 0)
        {
            k --;
            free_x[free_num++] = col;
            continue;
        }
        if(max_r != k)
        {
            for(int j = col; j < var+1; j++)
                swap(a[k][j],a[max_r][j]);

        }
        for(int i = k + 1; i < equ; i++)
        {
            if(a[i][col] != 0)
            {
                for(int j = col; j < var+1; j++)
                    a[i][j] ^= a[k][j];
            }
        }

    }
    for(int i = k; i < equ; i++)
        if(a[i][col] != 0)
            return -1;
    if(k < var) return var-k;

    for(int i = var-1; i >= 0; i--)
    {
        x[i] = a[i][var];
        for(int j = i +1; j < var; j++)
            x[i] ^= (a[i][j] && x[j]);

    }
    return 0;

}

int n;
void ini()
{
    memset(a,0,sizeof(a));
    memset(x,0,sizeof(x));
    equ = 5*6;
    var = 5*6;
    for(int i = 0; i < 5; i++)
    {
        for(int j = 0; j < 6; j++)
        {
            int tt = i*6+ j;
            a[tt][tt] =1;
            if(i > 0) a[(i-1)*6+j][tt] = 1;
            if(i < 5-1) a[(i+1)*6+j][tt] = 1;
            if(j > 0) a[tt-1][tt] = 1;
            if(j < 6-1) a[tt+1][tt] =1;
        }
    }
}

char str[30][30];

int main()
{
    int T,cas = 1;
    int val;
    scanf("%d",&T);
    while(T--)
    {
        ini();
        for(int i = 0; i <5; i++)
        {
            for(int j = 0; j < 6; j++)
            {
                scanf("%d",&val);
                a[i*6 + j][30] = val;
            }
        }
        int ans = Gauss();
        printf("PUZZLE #%d\n",cas++);
        for(int i = 0;i < 5;i++)
        {
            for(int j = 0;j < 5;j ++)
            {
                printf("%d ",x[i*6+j]);
            }
            printf("%d\n",x[i*6+5]);
        }

    }
    return 0;
}





poj 1222 高斯消元详解 题意 有一个5 * 6的矩阵,每个位置表示灯,1表示灯亮,0表示灯灭。 然后如果选定位置i,j点击,则位置i,j和其上下左右的灯的状态都会反转。 现在要你求出一个5 * 6的矩阵,1表示这个灯被点击过,0表示没有。 要求这个矩阵能够使得原矩阵的灯全灭。 非诚勿扰。 解析 来源 首先,要明确一些问题: 1.这些灯点击的顺序可以是任意的; 2.每只灯只能被点击1次,因为点击2次相当 阅读详情

相关推荐

【Creo】关于Creo一换网络就报错许可证丢失问题解决方案

依照我的个人理解,Creo只要一更换网络,则其许可证里面的网卡参数和现在的网络就对不上了,所以就会出现报错,并且有可能是报错代码(-9),提示许可证激活有问题。

weixin_52002180的博客 6036

poj1222

EXTENDED LIGHTS OUT Description In an extended version of the game Lights Out, is a puzzle with 5 rows of 6 buttons each (the actual puzzle has 5 rows of 5 buttons each). Each button has a light

◆◇丶生如夏花。谁来订阅我的悲伤 548

BQ40Z50R2循环学习实战:量产文件生成与关键状态位解析

本文详细解析了TI BQ40Z50R2电量计循环学习(Golden Learning)的实战流程与量产文件生成方法。重点剖析了updateStatus状态位在充放电静置阶段的常见异常(如卡在0x04或跳至0x0E)及其根本原因,并提供了从环境控制、命令顺序到文件处理的完整避坑指南,帮助工程师高效完成量产配置。

weixin_29170327的博客 214

高斯消元入门②-异或线性方程组-POJ1222

题目大意: 给你一个5∗65 * 65∗6大小的二维01矩阵代表灯的开关状态。改变任意一个灯的状态,会导致其上下左右的灯的状态的改变。问一种灯的开关方案使得最终所有灯都关闭. 题目思路: 首先,一个灯只会被按0次或1次。两次等于没按。不同灯按下的效果是叠加起来的. 解释:想象按下某个位置,等效于原矩阵异或上一个新矩阵。 例如按下(2,2)(2,2)(2,2)产生的效果. A2,2=[010111010]A_{2,2} = \left[\begin{array}{lll} 0 & 1 & 0

qq_35577488的博客 721

手把手教你完成基于cnn的手写数字识别系统MATLAB语言

手写数字识别是经典的 CNN 分类应用之一,常用的数据集就是 MNIST 手写数字数据集,包含 0~9 这 10 个数字的手写图片,每个数字都由 6 万幅训练图像和 1 万幅测试图像构成。为了便于直观分析,这里选择 MATLAB 工具箱提供的 DigitDataset 进行训练识别,读者也可以直接利用 MNIST 数据集或者自己设计的数据集进行实验。其中,数据集文件夹 db 如图 所示。在数据集文件夹 db 里面对每个数字都建立了子文件夹,各自包含 1000 幅 28×28 大小的二维灰度图像。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1368

NVIDIA Omniverse 技术浅析(三):NVIDIA RTX 技术

NVIDIA RTX 技术是 NVIDIA 推出的革命性图形渲染技术,旨在通过硬件加速和软件优化,实现高质量的实时图形渲染。RTX 技术在 NVIDIA Omniverse 平台中扮演着至关重要的角色,为其提供了强大的渲染能力。

m0_75253143的博客 351

关灯游戏 Lights out (二)(首行枚举+位运算,搜索全部解)

关灯游戏的简介就不介绍了,还不了解的朋友可点击笔者的上一篇博文----关灯游戏 Lights out (一)(极速求解)          在这一篇给大家介绍“关灯游戏”的枚举算法。          枚举算法很简单,就是枚举所有开关操作,然后逐一检索经过各种操作后局面的最终状态,当灯全灭时输出解。          对一个m×n的灯阵,并不需要枚举整个局面2^(m×n)种开关组合。因为任意

MHL_1208980380的博客 7778

以太网GMAC-RK3568

第 2 章和第 3 章中针对 RMII/RGMII 接口芯片和 USB 以太网两种类型芯片在 SDK 上的配置做详细的描述,第 4 章介绍以太网在 Android 上的相关调用接口。第 5 章提供常见问题的排查建议由于在 RK 系列的 SoC 中内置了以太网 MAC 控制器,所以只需要搭配一颗以太网 PHY 芯片,即可实现以太网卡功能按照规范,即使是不同厂家的 PHY,仍然有一部分寄存器的定义是通用的,只要配置了这些通用的寄存器,基本上 PHY 就可以正常工作代码位置在。

qq_24093081的博客 1942

熄灯问题 Lights Out Puzzle

light out

行风 3711

Python在Genesis2000 CAM软件中的编程应用

Genesis2000是一款功能强大的计算机辅助制造(CAM)软件,它提供了广泛的功能和工具,用于帮助制造商进行CAD(计算机辅助设计)到CAM的转换。在Genesis2000中,我们可以利用Python的灵活性和功能来扩展软件的自定义能力,并通过编写脚本来自动化各种制造任务。例如,假设我们需要在Genesis2000中添加一个新的操作,用于自动计算零部件的重量。我们可以编写一个Python脚本,通过遍历模型的几何数据并应用相关的计算公式,来实现这个功能。

PixelEnigma的博客 2423

改进后的yolov8导出进行部署到rk3588上时,导出为onnx格式报错aten::fft_fft2算子不支持导出...如何解决?

🏆本文收录于《全栈Bug调优(实战版)》专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!! 备注:部分问题/疑难杂症搜集于互联网。

**My Coding Family** 1797

poj 1222 EXTENDED LIGHTS OUT(高斯消元)

http://poj.org/problem?id=1222 先贴一个链接 http://blog.youkuaiyun.com/u013081425/article/details/24248247 枚举第一行的状态,进行试探,当最后一行都为0时,说明该方案可行。 另一种方法是高斯消元。 转载分析:这个游戏的名字叫做Lights Out。一个板子上面有MxN个按钮,按钮

3067

跟踪雷达点迹处理

1,点迹定义: 假设研究对象为位置x和速度v,预测值是根据这一时刻的x值、v值来预测下一时刻的x、v;测量值是根据传感器也就是雷达得到的,因为各种误差的存在,这两个值都不准确,所以把他们加权融合,得到一个新的量—状态值。 点迹就是所谓的测量值,由雷达对同一个目标探测到的一系列点(假设目标静止,但由于误差的存在,会扫描出不止一个点),航迹对应状态值,是点迹和预测轨迹的加权融合。 2,雷达信号和点迹处理关系: 3,点迹航迹处理流程 4,仿真 clear all; RealData=G

wangjie36的博客 1万+

POJ1222 EXTENDED LIGHTS OUT 高斯消元入门

题目链接:POJ1222 参考来源:大佬的题解 关于这个知识点我翻了许多博客,最后找到这一篇讲的十分清楚,所以转在这里。部分代码加了自己的注释,方便大家更容易看明白。 题意:给出一个5*6的图,每个灯泡有一个初始状态,1表示亮,0表示灭。每对一个灯泡操作时,会影响周围的灯泡改变亮灭,问如何操作可以使得所有灯泡都关掉。 思路:因为每盏灯,如果操作两次就相当于没有操作,所以相当于(

xyry 358

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

POJ 1222 高斯消元

题目连接http://poj.org/problem?id=1222 开始刷高斯消元的题目。并整理收藏了一下模板,包括整数和double型的。主要在于方程组的建立。 #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include &lt...

weixin_30295091的博客 80

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【高斯消元】poj 1222

http://poj.org/problem?id=1222 高斯消元,关键是初始化构造系数矩阵,有了增广矩阵套模板即可 /* poj 1222 高斯消元 题意: 类似于翻转棋,按一下上下中左右翻转,给定初始状态,问回到全0的状态的按键方案 思路: 对于每个位置,倒着想,初始为0,上下中左右加起来为初始状态,每一个位置皆如此。 30个位置,30个变量,30个方

Hacker_vision 502

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

POJ1222 EXTENDED LIGHTS OUT 高斯消元

题目链接:http://poj.org/problem?id=1222 题目大意:给你一个5*6 的矩阵,矩阵里每一个单元都有一个灯和一个开关,如果按下此开关,那么开关所在位置的那个灯和开关前后左右的灯的状态都会改变(即由亮到不亮或由不亮到亮)。给你一个初始的灯的状态,问怎样控制每一个开关使得所有的灯最后全部熄灭(此题保证有唯一解)。 分析:高斯消元。很显然每个灯最多只需要按1

AC_Gibson的专栏 552

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

POJ.1222 EXTENDED LIGHTS OUT(高斯消元 异或方程组)标签(空格分隔): 高斯消元题意分析给出t组数据,每组数据为一个5×65×6的矩阵,矩阵中元素为0或1。在矩阵中选择每次点击一个点,可以将其相邻的(上下左右)的元素异或,即1变为0,变为1。求如何点击才能使得矩阵全部变为0。 输出一个5×65×6的矩阵,其中1表示点击该位置,0表示不点击。典型的开关问题,用高斯消元构造

Pengwill's Blog 416

POJ - 1222 高斯消元基础题,解异或方程组

POJ 1222 题意:给出5行6列的矩阵,每个位置有一个数,0或1。在(i,j)的位置按一下,则它自身和它上下左右的位置都要反转,要通过这样的操作把所有位置都变为0。输出一个5行6列的矩阵,1表示这个位置按了,0表示没按。 总结:高斯消元,还没有完全弄明白,参考大神博客强行码了一发。。。 // POJ - 1222 #include<iostream> #inc...

weixin_30823833的博客 155

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

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

weixin_30273763的博客 88

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

题目地址:POJ 1222 题意:有一个5*6的矩阵,每个位置都表示按钮和灯,1表示亮,0表示灭。每当按下一个位置的按钮,它和它周围灯的状态全部翻转(题目中给出如何影响),问在这样的一个方阵中按下哪些按钮可以把整个方阵都变成灭的,这时1表示按了,0表示没按。 #include #include #include #include #include #include #include

Rocky0429 1883

EXTENDED LIGHTS OUT POJ - 1222 (高斯消元)

POJ - 1222 Description In an extended version of the game Lights Out, is a puzzle with 5 rows of 6 buttons each (the actual puzzle has 5 rows of 5 buttons each). Each button has a light. When a butt...

FIVE 327

高斯消元 POJ 1830 1222 1753

做了高斯消元题目若干,总结: AX = B A是已知的状态矩阵,a[i][j]表示物j对物i有关联作用。如果作用是相互的,则是对称矩阵。 B的设置根据初始状态和末状态的差值状态。B0+AX = B1,B = B1 - B0. A是n*n矩阵,秩为r;增广矩阵(A|B)是n*(n+1)矩阵,秩为s Ⅰ.  s != r 方程无解,即没有方案满足; Ⅱ.  s == r

Baileys0530的专栏 888

【POJ1222】EXTENDED LIGHTS OUT 高斯消元、解异或方程组

题意: 多组数据、 有个5*6的图,然后你要对某些位置进行操作,使得最后灯的状态如图。 操作:这个灯位置的上下左右以及自己这五盏灯状态都取反。 然后输出操作。 说实话什么亮灭什么我全都没考虑。 直接瞎写一遍就PE了,改改就AC了。 高斯消元解异或方程组: 跟正常高斯消元一样,只不过拿一个式子A消式子B的时候,是用异或而不是加减乘除。 代码: #inclu

辗转山河弋流歌 1998

poj1222 EXTENDED LIGHTS OUT (高斯消元)

题目链接:http://poj.org/problem?id=1222 一,题意: 有一个5 * 6 的矩阵 矩阵里面每一个格子都有一个开关,开关只有两种状态,开与关。 我们用1表示开,0表示关,每一个开关的状态变化都会影起其上下左右开关的变化。 我们开始给出矩阵中所有开关的初始状态,问改变多少个开关的状态能使得所有开关变成关。 我们用1表示改变,用0表示不变。输出所有开关改变状态。

漩涡梦幻 625
上一篇: poj1681 高斯消元
下一篇: poj1753 高斯消元
Tyuio28
博客等级 码龄11年 12粉丝 279原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值