还是这个代码
http://blog.163.com/prevBlogPerma.do?host=simplesource&srl=10341406200981362416959&mode=prev
这几天对代数计算部分的源码研究了一下。代数都忘光了,重新看了些矩阵的知识,总算对算法有了个大概的了解。
=====================================
如下是原文:
吧上面的矩阵看成一个m*n的向量X=(x1,x2,...,x(m*n))
对于位置k上的开关,它将变化最多5个位置的开关,对应一个向量
C(k)=(0,0,...,1,0,....,1,...,0)
其中开关状态改变的位置为1,开关状态不改变的位置为0
对于初始向量X=(x1,x2,...,x(m*n)),使用了开关C(k)后,状态会变成
X+C(k) (mod 2)
所以对初始向量X,我们需要选择一系列的k1,k2,...,ks使得
X+C(k1)+C(k2)+....+C(ks) (mod 2)=O=(0,0,0,...,0)
我们可以同样构造一个0,1向量Y,使得,如果位置k出现在k1,k2,...ks中,那么Y
在位置k的值是1,不然是0,这样,我们就可以将上面公式写成矩阵形式
X+Y*C (mod 2)=O
其中C=(C(1)' C(2)' .... C(m*n)')'
也就是C是由这m*n个行向量构成的矩阵,第k行就是向量C(k)
最二阶域上,加和减是相同的,也就是上面的方程等价于
Y*C (mod 2)=X
其中C,X已知,求Y.
由于(mod 2)运算是一个域 (关于乘除加减封闭,加减是mod 2加减,还满足结合率,交换率)
所以我们可以直接在二阶域上用高斯消元法求解(注意加减是mod 2的,对应计算机上的异或运算)
其中,如果C可逆,解是唯一的,如果C不可逆,解可能不存在,也可能不唯一。
=====================================
这个代码写得很清晰。我大概描述一下吧:
>>也就是C是由这m*n个行向量构成的矩阵,第k行就是向量C(k)
1、获得 C,放入矩阵 m_switch 里;
2、求出 C 的 逆矩阵,放入 m_trans;
3、X*(C-1),求得 Y,即 m_recorder。
然后验证一下,正确的话,即代表解是对的。
这个代码也从 c 移植成 java 了。
=====================================
其实,对于低阶的,还有一种查表算法,貌似更快。改天我写写看。
另外,这里还有个 applet 程序
http://www.anarkasis.com/rafa/
嗯,直接在这里可以运行
http://www.anarkasis.com/rafa/luces/lights.htm
这里给出的解比较多。一个图有四个解。
这个也是开源的。被收入在 wikipedia.org 里。
分享到:
相关推荐
关灯游戏,又称Lights Out,是一款经典的逻辑谜题,玩家需要在二维网格上操作开关,使得所有灯光熄灭。这个游戏看似简单,但其实蕴含了丰富的数学原理和算法知识。下面我们将深入探讨其背后的逻辑、解题策略以及如何...
2. **数据结构**:用于存储游戏状态和解法的数据结构,如二维数组或链表,以及用于表示灯泡状态的变量或枚举类型。 3. **用户界面**:图形用户界面(GUI)或命令行界面(CLI),使用户能方便地输入游戏布局和查看...
关灯游戏,又称为“开关灯谜题”,是一种经典的逻辑思维和计算机科学问题。在这个游戏中,一排灯(通常数量很大)被设定为开或关的状态。玩家每次可以选择一个特定的灯,然后改变该灯以及它所有相邻灯的状态——即...
双层规划模型的遗传算法求解的Matlab源码 双层规划模型的遗传算法求解是指使用遗传算法解决双层规划问题,这类问题广泛应用于管理科学、经济学、工程等领域。遗传算法是一种基于自然选择和遗传的优化算法,模拟生物...
C++大作业基于C++实现Eigen求解曲线拟合源码.zipC++大作业基于C++实现Eigen求解曲线拟合源码.zipC++大作业基于C++实现Eigen求解曲线拟合源码.zipC++大作业基于C++实现Eigen求解曲线拟合源码.zipC++大作业基于C++实现...
### 数独求解程序游戏设计报告书 #### 一、数独游戏介绍 数独(Sudoku)是一种逻辑填数字游戏,玩家需按照一定的规则在9×9的网格内填入1至9的数字,使得每一行、每一列以及每一个3×3的小宫格内的数字都不重复。...
VC游戏编写中的求解最短路径算法源码,本示例是自动寻径演示,篮点是起点,红点是终点,按确定键开始。源码爱好者注:编译后运行的时候请把EXE文件从Debug目录中拷贝到项目根目录中,若不然会出错。 编著、程序...
通过阅读和分析源码,开发者可以学习如何创建游戏对象模型、处理触摸事件、动画效果以及如何实现自动求解算法。源码中的每个类、方法和变量都对应着游戏的某个特定部分,例如,可能有一个名为`JigsawPiece`的类代表...
推箱子界面程序, 可以玩游戏, 包括源码 推箱子界面程序内置演示解法和求解调用, 使用sokoban.exe的解法表达式 推箱子也叫搬运工,仓库小子 ************************* 算法DLL模块已经完全成熟并完成32位Windows...
Python 实现的有限元方程求解程序源码课设项目.zipPython 实现的有限元方程求解程序源码课设项目.zipPython 实现的有限元方程求解程序源码课设项目.zipPython 实现的有限元方程求解程序源码课设项目.zipPython 实现...
倒水解密游戏源码 游戏介绍: 《倒水解密》是一款很不错的益智类游戏 有N个容量不同的瓶子,指定「将a升水倒入容量为b的瓶子」。 游戏要求通过装水、倒水,达成给定的目标。 游戏操作方式如下: ?在瓶子上双击...
双层规划模型的遗传算法求解 Matlab 源码 本文档提供了一个双层规划模型的遗传算法求解的 Matlab 源码,用于解决复杂的优化问题。该源码实现了一个基于遗传算法的双层规划模型,能够高效地解决复杂的优化问题。 ...
基于MATLAB实现微分方程有限元离散+隐式梯度计算+SQP求解优化问题源码(常微分系统).zip基于MATLAB实现微分方程有限元离散+隐式梯度计算+SQP求解优化问题源码(常微分系统).zip基于MATLAB实现微分方程有限元离散+隐式...
基于SAT的二进制数独游戏求解程序 介绍 要求基于DPLL算法实现一个完备SAT求解器,对输入的CNF范式算例文件,解析并建立其内部表示;精心设计问题中变元、文字、子句、公式等有效的物理存储结构以及一定的分支变元...
本项目"数独(Sudoku,九宫格游戏)求解程序"是一个能够自动求解各种难度数独谜题的软件。它利用计算机算法瞬间完成复杂的游戏解题过程,为玩家提供了极大的便利。源码开放,这意味着编程爱好者可以深入研究其内部机制...
基于Python实现的迷宫求解小游戏.zip 这是95分以上高分必过课程设计项目,下载即用无需修改,确保可以运行。也可作为期末大作业。 基于Python实现的迷宫求解小游戏.zip 这是95分以上高分必过课程设计项目,下载即...
【优化求解】粒子群优化和重力搜索算法求解MLP问题matlab源码.md
【作品名称】:C 实现基于SAT的数独游戏求解程序【课程设计】(课程设计报告+源码) 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 ...