高斯消元在开关灯泡问题中的应用

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

  设其次方程组:

    a11*x1+a12*x2+a13*x3...+a1n*xn=b1,

    a21*x1+a22*x2+a23*x3...+a2n*xn=b2,

    .....

    am1*x1+am2*x2+am3*x3...+amn*xn=b3.


  写成矩阵形式:

  系数矩阵:

  a11   a12   ...   a1n

  a21   a22   ...   a2n

    .         .               .

   am1  am2 ...   amn


  解的矩阵

  b1

  b2

   .

  bn

 

  增广矩阵

  a11   a12   ...   a1n b1

  a21   a22   ...   a2n   b2

    .         .               .        .

   am1  am2 ...   amn  bn


  如果系数矩阵和增广矩阵的秩相等,有解(秩等于变元个数有唯一解,否则有多解)。秩不相等无解。


 对于灯泡开关问题,系数矩阵相当于操作矩阵,N个灯泡就构成N*(N+1)的矩阵,矩阵只由0,1组成,矩阵的关系不是相加而是异或!把一开始的状态赋给b1,b2...bn(a[i][N],下标从0开始),第一列代表第一个灯泡,把它和它相关的灯泡都设成1。比如第一个灯泡和第二、三个灯泡相关,就把a[1][1],a[2][1],a[3][1]设成1。把每个灯泡都这么做。构造完矩阵后求解就行了。

    这样构造矩阵的原因是,可以由灯泡的开关次数xi列出线性方程组,矩阵a元素值最大是1,因为重复开关没意义,xi的取值会影响和灯泡i相关的灯泡的取值。

   

    a11*x1^a12*x2^a13*x3...^a1n*xn=b1,

    a21*x1^a22*x2^a23*x3...^a2n*xn=b2,

    .....

    am1*x1^am2*x2^am3*x3...^amn*xn=b3.


   求解的时候可能0解,1解,多解,多解的时候可能会要求和最小的那个。有了模版每次只要构造矩阵就行了~得意

int equ,var;//equ个方程,var个变元
int a[MAXN][MAXN];//增广矩阵,行数为equ,列数为var+1,从0开始
int x[MAXN];//解集
int free_x[MAXN];//储存自由变元
int free_num;//自由变元个数
//针对灯泡问题的异或高斯消元
int xor_gauss(){
    int row=0,col=0;//当前矩阵阶梯下降了row次,当前在处理第col列
    free_num=0;
    for(;row<equ&&col<var;col++){
        int r;
        for(r=row;r<equ;r++) if(a[r][col]) break;//找当前row或者往下第一个a[r][col]!=0,r>=row
        //没找到,说明这一列矩阵阶梯没有下降,x[col]是自由变元,可以取任意值
        if(!a[r][col]){
            free_x[free_num++]=col;
            continue;
        }
        if(row!=r) for(int i=0;i<var+1;i++) swap(a[row][i],a[r][i]);//找到了,并且row!=r,把第row行和第r行交换
        //把row下面的行a[i][j]!=0的变为0,即和第row行相减
        for(int i=row+1;i<equ;i++) if(a[i][col]){
            for(int j=col;j<var+1;j++) a[i][j]^=a[row][j];
        }
        row++;//阶梯下降
    }
    for(int i=row;i<equ;i++) if(a[i][var]) return -1;//增广矩阵的秩如果大于方程组举证的秩,无解
    if(row<var) return var-row;//自由变元个数
    //唯一解,回带
    for(int i=var-1;i>=0;i--){
        x[i]=a[i][var];
        for(int j=i+1;j<var;j++) if(a[i][j]) x[i]^=x[j];//x[i]之后的解都已经确定,由此推出x[i]
    }
    return 0;
}
//枚举自由变元,以返回所有解的和最小为例
int enum_free(int n){//n个自由变元,n>0
    //状态压缩枚举
    int ret=INF,S=(1<<n);
    for(int S0=0;S0<S;S0++){
        int cnt=0;//统计所有解的和
        for(int j=0;j<n;j++){
            if((1<<j)&S0){
                x[free_x[j]]=1;
                cnt++;
            }
            else x[free_x[j]]=0;
        }
        //还剩var-n个变元
        for(int i=var-n-1;i>=0;i--){
            int idx;//当前要找非自由变元x[idx]
            for(idx=i;idx<var;idx++) if(a[i][idx]) break;//找到第i行第一个非0的元素
            x[idx]=a[i][var];
            for(int j=idx+1;j<var;j++) if(a[i][j]) x[idx]^=x[j];
            cnt+=x[idx];
        }
        ret=min(ret,cnt);
    }
    return ret;
}


POJ 1830 开关问题(高斯消元) 传送门 Description 有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相联系的开关的状态如果原来为开就变为关,如果为关就变为开。你的目标是经过若干次开关操作后使得最后N个开关达到一个特定的状态。对于任意一个开关,最多只能进行一次开关操作。你的任务是,计算有多少种可以达到指定状态的方法。(不计开关操作的顺... 阅读详情

相关推荐

Apollo学习笔记(4)坐标系

百度Apollo项目用到了多种坐标系,其中帮助文档提及的坐标系包括: 全球地理坐标系(The Global Geographic coordinate system ) 局部坐标系—东-北-天坐标(The Local Frame – East-North-Up,ENU) 车身坐标系—右-前-天坐标(The Vehicle Frame —Right-Forward-Up,RFU) 车身坐标系—前-左-天坐标(The Vehicle Frame —Front-Left-Up,FLU) 还有一种Frenet坐标

qq_24649627的博客 5798

开关灯类问题 (高斯消元)

POJ 1222 EXTENDED LIGHTS OUT #include #include #include using namespace std; int a[35][35]; int x[35]; void gauss(int n,int m) { int r=0,c=0; while(r<n&&c<m) { int t=r; for(int i=r+1;

HHH_go_的博客 640

【LVGL】学习笔记--(3)界面切换以及显示优化

界面切换和帧率优化

sinat_33408502的博客 1万+

hdu3364 高斯消元1(开关控制灯,异或解的个数)

n个灯,m个开关,某个开关能同时控制某些灯。问达到最终状态的方案数高斯异或消元,答案为2^xx为自由变量的个数或无解 具体消元代码注释:think!! 1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 using namespace std; 5...

weixin_33847182的博客 596

C# 进程间 双内存共享 高帧率图像传输

演示了两个进程之间通过 双内存共享 的方式, 来实时处理图像,并以高帧率(40~60FPS)传输的基本示例。 进程间内存共享的优点:高性能、低延迟、资源效率高、简单可靠。 适用场景:实时图像处理、大数据传输、多进程协作、实时监控系统,等等。

qianqiansd 1996

告别全局搜索!7种SRP-PHAT快速算法实战对比:哪个更适合你的麦克风阵列?

本文深入探讨了7种SRP-PHAT改进算法在声源定位领域的实战表现,包括SRC、CFRC、SPF等方案。通过对比计算效率、定位精度和环境鲁棒性等核心指标,为不同场景(如会议室、智能家居、工业机器人)提供算法选型建议,帮助工程师优化麦克风阵列性能。

weixin_42546392的博客 397

费解的开关 高斯消元

费解的开关 你玩过“拉灯”游戏吗?25盏灯排成一个5x5的方形。每一个灯都有一个开关,游戏者可以改变它的状态。每一步,游戏者可以改变某一个灯的状态。游戏者改变一个灯的状态会产生连锁反应:和这个灯上下左右相邻的灯也要相应地改变其状态。 我们用数字“1”表示一盏开着的灯,用数字“0”表示关着的灯。下面这种状态 10111 01101 10111 10000 11011 在改变了最左上角的灯的状态后将变...

咸鱼 375

《双剑合璧:双 IMU 驱动的高精度 AHRS 实战宝典(基于 ROS2)》

本文系统阐述了基于双IMU的高精度姿态与航向参考系统(AHRS)设计与实现方法。文章首先分析了传统单IMU系统的局限性,提出通过双IMU冗余配置实现性能互补的方案。从硬件设计要点(包括IMU选型策略、电路降噪方法、PCB布局规范),到算法实现方案(互补滤波、卡尔曼滤波等融合算法),再到ROS2软件架构与调优策略,全方位展示了双IMU系统的技术实现路径。特别强调快速性与高精度平衡的方法,包括动态参数调整、双IMU权重优化等核心技巧。最后总结了硬件降噪、算法调优等实用心法。

bother3000的博客 2023

poj 1222 高斯消元入门 开关问题

传送门 题意 有5*6=30个的灯,每次拨动某个灯的开关,那么这个灯的上下左右的灯以及它本身的状态会发生变化,现在给出初始状态,要求也输出一个5*6的矩阵,1表示这个灯的开关被操作过,0表示没有,问能使灯全灭的操作是怎么样的 思路 首先一定要清楚一点:如果一个开关按动两次,那么就相当于没有操作 假设初始状态是全灭的,我们的目标状态是到题目中的初始状态,那么相同的操作是可以将题目中

竹丙丙丙丙 332

告别手写代码!用Simulink给TI F28335 DSP自动生成C代码(保姆级环境配置)

本文详细介绍了如何利用Simulink为TI F28335 DSP自动生成C代码,告别传统手写代码的低效与错误。通过保姆级环境配置指南和实战案例,帮助开发者快速掌握模型驱动开发方法,大幅提升嵌入式开发效率,特别适合需要频繁修改算法参数或团队协作的工程师。

weixin_30388677的博客 416

Habitat安装全网最详细教程,手把手带你跑通example.py(全网唯一)

全网最详细具身智能仿真平台habitat的安装教程

shannanshouyin的博客 2755

开关问题【高斯消元】

Description 有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的 开关也会相应地发生变化,即这些相联系的开关的状态如果原来为开就变为关,如果为关就变为开。你的目标是经过 若干次开关操作后使得最后N个开关达到一个特定的状态。对于任意一个开关,最多只能进行一次开关操作。你的任务 是,计算有多少种可以达到指定状态的方法。

zhang_di233的专栏 966

【数字IC验证进阶】正则表达式(Regular Expression)快速入门指南

在芯片开发过程中,正则表达式的使用非常常见。初次上手晦涩难懂,多用几次爱不释手!

悟已往之不谏 知来者之可追 1440

高斯消元题目小结

1、HDU - 3364 (https://vjudge.net/problem/HDU-3364) 题意: 有 nnn 盏灯,状态有亮 (1)(1)(1) 与暗 (0)(0)(0),有 mmm 个开关,每个开关按下会切换 kik_iki​ 盏灯的状态,每个开关至多按依次。现有 qqq 次询问,每次询问有多少种方案使得灯的状态为 sis_isi​。(n,m≤50,q≤1000)(n, m \leq...

weixin_44059127的博客 305

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

poj1830 开关问题[高斯消元]

其实第一反应是双向BFS或者meet in middle,$2^{14}$的搜索量,多测,应该是可以过的,但是无奈双向BFS我只写过一题,已经不会写了。 发现灯的操作情况顺序不影响结果,因为操作相当于在固定位进行xor运算,xor是可以随便交换的,所以顺序无所谓。 那么情况取决于每盏灯是否被操作过。设这个量为未知量$x_i$。于是可以设计方程,对于每个灯,有 $begin \tex...

dianer2977的博客 186

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

208. 开关问题 —— 高斯消元

Link 高斯消元问题 书上还用了状压,明天写一下。 其实就是对于每盏灯 xix_ixi​,均有一个数组aaa 如 aaa = {0, 1, 1, 0}表示对第 iii 盏灯操作,则第2,3盏灯也会变化,于是构成一个二维矩阵a[i][j]a[i][j]a[i][j],a[i][j]=1a[i][j] = 1a[i][j]=1则表示操作开关 j ,开关 i 也会变化,特别的,a[i][i]=1a[i][i] = 1a[i][i]=1,等号右侧即为每盏灯的初始状态xor最终状态。 代码 inline int g

Strezia的博客 196

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【poj1222-又一道开关问题】高斯消元求解异或方程组

【poj1222-又一道开关问题】高斯消元求解异或方程组 题意:给出一个5*6的图,每个灯泡有一个初始状态,1表示亮,0表示灭。每对一个灯泡操作时,会影响周围的灯泡改变亮灭,问如何操作可以使得所有灯泡都关掉。 题解: 这题和上一题几乎完全一样。。就是要输出解。。 然后我发现我回代的过程错了TAT 已修改上一题代码和模版 因为回代的过程合!并...

qq_25768269的博客 186

hdu3364 Lanterns 高斯消元

//有m个开关,n个灯泡,每个开关可以控制不同的灯泡(可以有多个) //给定n个灯泡的亮暗情况,问有多少种开关的情况 //用a[i][j]表示第j个开关对第i个灯泡能否控制,1为能,0为否 //用高斯消元,ans = 2^(var-k) ,(var-k)为自由变量数 #include #include #include using namespace std ; const int

ijbuhv的专栏 1004

poj 1830 开关问题高斯消元

题意: 给定n个灯泡。 第一行给的是灯泡的初始状态; 第二行给的是灯泡的终止状态。 然后给定一些关系,表示按下灯泡fr,灯泡to和fr的的状态都翻转。 现在要问有多少种摁开关的方法,使得灯泡从初始状态到达终止状态。 解析: 做过n*n的,线性的反而不会了囧- - 线性的直接把关系做成矩阵去求解就行了: 比如题1的关系矩阵为: 1   1   1 1   1   1

渐近自由 535

Hdu 3364 Lanterns(高斯消元)

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=3364 思路:灯的状态是由控制它的开关的异或值所决定的,每个开关值为0或1,所以设 (xi*k1)^(xi*k2)^.....^(xi*km) = xi 灯为x,开关为k。得到一方程组,高斯消元后等式左边系数全为0,若等式右边系数不为0,则无解。否则,答案为2^(自由元(不管开或关都行)个数)。

哆啦AC梦的博客 971

开关问题(POJ-1830)

Problem Description 有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相联系的开关的状态如果原来为开就变为关,如果为关就变为开。你的目标是经过若干次开关操作后使得最后N个开关达到一个特定的状态。对于任意一个开关,最多只能进行一次开关操作。你的任务是,计算有多少种可以达到指定状态的方法。(不计...

Alex_McAvoy的博客 4561

高斯消元HDU-3364 Lanterns

这道题是异或之后有多解的方案数,那一个解的在么么哒书上有。 书上说还可以处理方程数和未知数的数量不相等或者解不唯一的情况。还可以求得行列式的值和矩阵的秩(我觉得求秩就是方案数)。

起一个长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长长的名字 668

[hihocoder #1196 : 高斯消元·二] 高斯消元求异或方程组

[hihocoder #1196 : 高斯消元·二] 高斯消元求异或方程组 题目链接:[hihocoder #1196 : 高斯消元·二]  解题思路: 首先对于每一个格子的状态,可能会对它造成影响的是其自身和周围4个格子,这五个格子被按下的总次数也就等于该格子所改变的总次数。 对于任意一个格子,如果这个格子改变了偶数次状态,则等价于没有发生改变。 我们可以将1看作格子亮

Fighting! 1403

hdu3364-高斯消元(取模)

列n个方程,表示每个灯会被哪些开关控制, 得到一个一个n*m的矩阵,最后一列为所要求的状态 则对这个(n+1)*(m)的矩阵高斯消元,得到方案数,答案爆int #include #include #include #include #include #include #include #include #include #include using

缺氧 2189

HDU-3364 Lanterns(高斯消元)

                                                    Lanterns                                    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)                    ...

nka_kun的博客 336

HDU 3364 Lanterns (高斯消元解开关问题)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=3364 题意:n盏灯,m个开关控制,给出每个开关控制的灯序号,求要使所以等为某个状态的方法数(每个开关只有2种状态)。 思路:高斯消元求解方程组的解,m个开关的状态为变量,n盏灯的状态为n条方程的解,异或方程。 #include #include #include #include #incl

cookiesMonster 463
上一篇: 线性筛素数 线性筛欧拉函数
下一篇: hdu 3972 1 M possible
小小小小葱
博客等级 码龄14年 22粉丝 266原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值