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

还是这个代码


[url]http://blog.163.com/prevBlogPerma.do?host=simplesource&srl=10341406200981362416959&mode=prev[/url]


这几天对代数计算部分的源码研究了一下。代数都忘光了,重新看了些矩阵的知识,总算对算法有了个大概的了解。


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


如下是原文:


吧上面的矩阵看成一个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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值