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

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

你可能感兴趣的:(poj)