`
zwhc
  • 浏览: 264744 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

《求解关灯游戏》源码分析之二

阅读更多
还是这个代码


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 里。




0
0
分享到:
评论
1 楼 zwhc 2010-07-13  
http://topic.csdn.net/t/20050119/10/3737122.html

这道题就是经典的关灯游戏。题目中已经给出了提示,暗示我们可以一行一行或是一列一列的将灯关掉,通过在第i+1行上按键关掉第i行的灯,或通过在第 i+1列上按键关掉第i列的灯。我们采用一列一列关灯的方法。经过思考,我们可以得知,当第一列的按法确定后,后面每一列的按法就确定下来了:若第i行第 j列的灯是亮的,则需要在第i行j+1列按一下。在最后一列按完后,结果也定了。若结果是最后一列的灯全部关掉,则此按法是一个符合题意的解。因此,我们只需要枚举第一列的按法,然后进行模拟,一列一列的关灯,判断最后一列是否全部关掉即可。矩阵的规模非常小,仅5×6,算法复杂度为O(2^5   *   5   *   5),不需任何顾忌。

========================================

昨天,我说:其实,对于低阶的,还有一种查表算法,貌似更快。改天我写写看。

基本思路和上面的贴子一样。

因为各种情况,都可以简化成最后一行。那么,将所有的情况列出,按最后一行的不同进行保存在一个对应表里。
求解时,也简化成最后一行,从对应表里进行查找。再将按了两次的开关取消,就得到解了。

相关推荐

    求解关灯游戏的全部解

    关灯游戏,又称Lights Out,是一款经典的逻辑谜题,玩家需要在二维网格上操作开关,使得所有灯光熄灭。这个游戏看似简单,但其实蕴含了丰富的数学原理和算法知识。下面我们将深入探讨其背后的逻辑、解题策略以及如何...

    关灯游戏解题程序

    2. **数据结构**:用于存储游戏状态和解法的数据结构,如二维数组或链表,以及用于表示灯泡状态的变量或枚举类型。 3. **用户界面**:图形用户界面(GUI)或命令行界面(CLI),使用户能方便地输入游戏布局和查看...

    关灯游戏求解算法含代码

    关灯游戏,又称为“开关灯谜题”,是一种经典的逻辑思维和计算机科学问题。在这个游戏中,一排灯(通常数量很大)被设定为开或关的状态。玩家每次可以选择一个特定的灯,然后改变该灯以及它所有相邻灯的状态——即...

    双层规划模型的遗传算法求解的Matlab源码-双层规划模型的遗传算法求解的Matlab源码.doc

    双层规划模型的遗传算法求解的Matlab源码 双层规划模型的遗传算法求解是指使用遗传算法解决双层规划问题,这类问题广泛应用于管理科学、经济学、工程等领域。遗传算法是一种基于自然选择和遗传的优化算法,模拟生物...

    C++大作业基于C++实现Eigen求解曲线拟合源码.zip

    C++大作业基于C++实现Eigen求解曲线拟合源码.zipC++大作业基于C++实现Eigen求解曲线拟合源码.zipC++大作业基于C++实现Eigen求解曲线拟合源码.zipC++大作业基于C++实现Eigen求解曲线拟合源码.zipC++大作业基于C++实现...

    数据结构课设基于SAT的二进制数独游戏求解C++源码+课设报告+代码注释.zip

    数据结构课设基于SAT的二进制数独游戏求解C++源码+课设报告+代码注释.zip 数据结构课设基于SAT的二进制数独游戏求解C++源码+课设报告+代码注释.zip 数据结构课设基于SAT的二进制数独游戏求解C++源码+课设报告+代码...

    数独求解程序游戏设计报告书

    ### 数独求解程序游戏设计报告书 #### 一、数独游戏介绍 数独(Sudoku)是一种逻辑填数字游戏,玩家需按照一定的规则在9×9的网格内填入1至9的数字,使得每一行、每一列以及每一个3×3的小宫格内的数字都不重复。...

    VC游戏编写中的求解最短路径算法源码

    VC游戏编写中的求解最短路径算法源码,本示例是自动寻径演示,篮点是起点,红点是终点,按确定键开始。源码爱好者注:编译后运行的时候请把EXE文件从Debug目录中拷贝到项目根目录中,若不然会出错。  编著、程序...

    自动求解的iPad 3.2 拼图游戏工程源码

    通过阅读和分析源码,开发者可以学习如何创建游戏对象模型、处理触摸事件、动画效果以及如何实现自动求解算法。源码中的每个类、方法和变量都对应着游戏的某个特定部分,例如,可能有一个名为`JigsawPiece`的类代表...

    Python 实现的有限元方程求解程序源码课设项目.zip

    Python 实现的有限元方程求解程序源码课设项目.zipPython 实现的有限元方程求解程序源码课设项目.zipPython 实现的有限元方程求解程序源码课设项目.zipPython 实现的有限元方程求解程序源码课设项目.zipPython 实现...

    推箱子自动求解及游戏(最终算法源码及程序)

    推箱子界面程序, 可以玩游戏, 包括源码 推箱子界面程序内置演示解法和求解调用, 使用sokoban.exe的解法表达式 推箱子也叫搬运工,仓库小子 ************************* 算法DLL模块已经完全成熟并完成32位Windows...

    双层规划模型的遗传算法求解的Matlab源码.doc

    双层规划模型的遗传算法求解 Matlab 源码 本文档提供了一个双层规划模型的遗传算法求解的 Matlab 源码,用于解决复杂的优化问题。该源码实现了一个基于遗传算法的双层规划模型,能够高效地解决复杂的优化问题。 ...

    倒水解密游戏源码2012918

    倒水解密游戏源码 游戏介绍: 《倒水解密》是一款很不错的益智类游戏 有N个容量不同的瓶子,指定「将a升水倒入容量为b的瓶子」。 游戏要求通过装水、倒水,达成给定的目标。 游戏操作方式如下: ?在瓶子上双击...

    基于MATLAB实现微分方程有限元离散+隐式梯度计算+SQP求解优化问题源码(常微分系统).zip

    基于MATLAB实现微分方程有限元离散+隐式梯度计算+SQP求解优化问题源码(常微分系统).zip基于MATLAB实现微分方程有限元离散+隐式梯度计算+SQP求解优化问题源码(常微分系统).zip基于MATLAB实现微分方程有限元离散+隐式...

    基于DPLL算法和SAT的二进制数独游戏求解程序C++源码+文档说明+实验报告

    基于SAT的二进制数独游戏求解程序 介绍 要求基于DPLL算法实现一个完备SAT求解器,对输入的CNF范式算例文件,解析并建立其内部表示;精心设计问题中变元、文字、子句、公式等有效的物理存储结构以及一定的分支变元...

    数独(Sudoku,九宫格游戏)求解程序(源码)

    本项目"数独(Sudoku,九宫格游戏)求解程序"是一个能够自动求解各种难度数独谜题的软件。它利用计算机算法瞬间完成复杂的游戏解题过程,为玩家提供了极大的便利。源码开放,这意味着编程爱好者可以深入研究其内部机制...

    基于Python实现的迷宫求解小游戏.zip

    基于Python实现的迷宫求解小游戏.zip 这是95分以上高分必过课程设计项目,下载即用无需修改,确保可以运行。也可作为期末大作业。 基于Python实现的迷宫求解小游戏.zip 这是95分以上高分必过课程设计项目,下载即...

    【优化求解】粒子群优化和重力搜索算法求解MLP问题matlab源码.md

    【优化求解】粒子群优化和重力搜索算法求解MLP问题matlab源码.md

Global site tag (gtag.js) - Google Analytics