这篇博文从UVaOJ上的问题1560入手,分析XOR方程组的高斯消元法。问题链接
异或?异或!
通过对问题的阅读,我们可以发现这是一道“0-1矩阵”的处理问题。题目中也有提示,同一个位置不必被按下多次,因为它始终只有两种状态。所以,布尔代数该上场了,而这次的主角是异或运算。这道题某种程度上可以看作是另一道题的一种思路的推广。
根据另一道题的思路,同样可得出类似下面这样的异或方程:
p i , j ⊕ p i + 1 , j ⊕ p i − 1 , j ⊕ p i , j + 1 ⊕ p i , j − 1 = b i , j p_{i,j}\oplus p_{i+1,j}\oplus p_{i-1,j}\oplus p_{i,j+1}\oplus p_{i,j-1}=b_{i,j} pi,j⊕pi+1,j⊕pi−1,j⊕pi,j+1⊕pi,j−1=bi,j
按照这个思路,可以列出30个这样的方程。这个原理肯定没错。于是,可以想到,如果能够利用边界上未知数较少的点首先缩小搜索的范围,那么这个问题便可能得到解决,就像这篇文章一样。
然而,现实是,由于未知数过多,这题使用迭代实现每步都有许多分支,于是就会非常地绕(以及可能很耗时)。似乎也有人使用这种方法成功地做了出来。有兴趣可以把左上角的点带进去试一试,本文不详述。
所以,如果有一种能够直接解决异或的联立方程的方法,那这个问题就能真正高效又通用地得到解决。
有方法吗?
反正博主自己是没想到。上网一查,有的文章1表示可以使用高斯消元来解。但是常规的高斯消元只能用于线性代数方程组,你说能移植就能移植?先举个例子来看看。
比如这个 { x ⊕ y = 1 , x ⊕ y ⊕ z = 0 , x ⊕ z = 0. \begin{cases} x\oplus y=1,\\ x\oplus y\oplus z=0,\\ x\oplus z=0.\end{cases} ⎩⎪