Problem Address:http://poj.org/problem?id=1222
就这道题而言,它是一道简单题。
【深搜思路】
(1)从左上角开始向右下角搜索,分别探测按与不按的情况。总共有2^(n*m)总情况。
(2)剪枝:每探测一个位置,判断它左上部分是否已全部关闭。由于每次都是向后探测,所以后面的行为不改变左上角的状态。如果存在灯开着的状态,则结束这个分支的搜索。
【深搜代码】
但是,这道题的最根本的思路却不是深搜。当然,对于小的数据量,深搜可以应付。但是大的数据却不行。
高斯消元法的思路复杂度为O(n^3)。
【高斯消元法】
如果学过矩阵的转换,理解起来就相对比较容易。
高斯消元用于求解多元一次方程组。具体百度:http://baike.baidu.com/view/33268.htm
先把对应的矩阵化为上三角形式,然后再化为单位矩阵。
增广部分即为所求的解。
【高斯消元思路】
参考资料:http://blog.csdn.net/shiren_Bod/archive/2010/07/26/5766907.aspx
我看的时候是在百度文库里看的。以上链接里也已经说了很多。
主要就是要求出AA*XX=LL。
当只有唯一解时,直接求出对应矩阵的逆矩阵就OK了。
如果不求逆矩阵,则需要进行转化。
说的简单一点,就是把A(i,j)转化为列向量,然后按从左到右的顺序填入n*m阶的矩阵中,然后把L转为列向量,填入增广部分。
之后求出解就OK了。
由于这道题有唯一解,我也是用转化为列向量的方法求的。
由于是二进制,所以全程使用异或,以及最后简化的时候要注意一下。
具体见代码。
【高斯消元代码】(由于是第一次模仿着写,也没考虑太多,不具备可扩展性,未学习不可模仿)
高斯消元其实还分为无解、唯一解以及无数解三种情况,思路也不是很难,具体以后碰到了再好好重新实现一遍。
【P.S】
这道题其实做的挺郁闷的。
本来是想找到简单的题做做。这道题是被认为是简单得连剪枝都不用的……然后就无限地卡。最后剪枝了才过。
然后看Discuss说可以用高斯消元。反正是学习,所以决定找找资料学习。
谁知道一看就看了n久。还好最后看懂了,也看透了。
该休息一下了?