您的位置:首页 > 其它

POJ 1222 & 1681 & 1830 & 3185 开关灯问题 (高斯消元 & 异或方程组)

2013-02-08 17:29 267 查看
POJ 1222 EXTENDED LIGHTS OUT

基本的开关灯问题.还保证唯一解.

我们把每一个灯泡当成一个状态xi,总共有30个,而且每个灯与其他灯的关系也很明显。所以我们就可以列30方程30个变元的方程组:

xi = 1 * xi + 1  * x(i-1) + 1 * x(i+1) + 1 * x(i-6) + 1 * x(i+6) = 1 or 0 (mod 2)     (0还是1看这个灯的初始状态,即输入数据)

这明显就是裸的高斯消元了,题目还保证有唯一解。。。唯一的难点就是mod 2的处理,但是也不难,只要在行阶梯矩阵回带求解时取模就可以了~~~(具体看代码吧)

代码:http://www.shaidaima.com/source/view/11233

POJ 1681 Painter's Problem

开关灯模型,求解中1最少的方案(求最优解)。此时我们往往需要枚举自由变元的状态来求出多解,但此题数据较弱,不需枚举,每次将自由变元置为0可过.

代码:http://www.shaidaima.com/source/view/11234

POJ 1830 开关问题

开关灯问题,求解的个数。更简单,唯一解输出1,多解时解的个数就是(2^自由变元个数).

不过这题我把它换用异或方程组做,即:

M[0][0]x[0]^M[0][1]x[1]^…^M[0][N-1]x[N-1]=B[0]
M[1][0]x[0]^M[1][1]x[1]^…^M[1][N-1]x[N-1]=B[1]

M[N-1][0]x[0]^M[N-1][1]x[1]^…^M[N-1][N-1]x[N-1]=B[N-1]

★:解异或方程也可以套用高斯消元法,只须将原来的加减操作替换成异或操作就可以了,两个方程的左边异或之后,它们的公共项就没有了。
具体的操作方法是这样的:对于k=0..N-1,找到一个M[i][k]不为0的行i,把它与第k行交换,用第k行去异或下面所有M[i][j]不为0的行i,消去它们的第k个系数,这样就将原矩阵化成了上三角矩阵;最后一行只有一个未知数,这个未知数就已经求出来了,用它跟上面所有含有这个未知数的方程异或,就消去了所有的着个未知数,此时倒数第二行也只有一个未知数,它就被求出来了,用这样的方法可以自下而上求出所有未知数。

代码:http://www.shaidaima.com/source/view/11235

POJ 3185 The Water Bowls

开关灯问题,和POJ1681一样,不过这题数据可没那么好糊弄,要枚举自由元了~还有怎么求解异或方程组……

代码:http://www.shaidaima.com/source/view/11236
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: