纠结于为什么顺着TLE,倒着就能AC……突然想起在看DLX的时候看到一个ZOJ3209里面也有类似的情况,顺着TLE倒着AC的情况- -找来那篇文章,复制代码,提交,顺利的TLE,然后找到他的比较部分,把<改成<=,顺利的AC了……

看来这不是N皇后的个别现象……其他问题构造的精确覆盖也会出现这问题……

到底是什么呢……

一不做,二不休,我干脆直接把两种不同程序的N皇后的搜索树都打印出来,在N=11的时候出现了不同,然后仔细比较那个搜索树,终于发现了问题!

话说在DLX里面有两层循环,第一层外循环是确定列,确定了列之后再枚举行

然后如果列是优先左边的话,枚举行的时候从下往上枚举就会更快的得到第一个解

而如果列优先右边的话,枚举行就是在从上往下枚举比较快

这样子也就解释了如果需要搜索到全部的解速度是一样的

另外一个很神奇的是在选择列的时候如果只选前N列而不是2N列的话,反而会比较快……

我估计这是由于问题的特殊性导致的模型的特点,也就说如果是一个随机的01矩阵进行DLX的话不会出现这种问题

先说为什么只枚举到N而不是2N会比较快,相当于在摆放旗子的时候每一步都先盯着每一行都只能摆放一个棋子,确定了这个条件再去看其他条件,这样子随着摆放的增加,约束会越来越强,而不容易出现放了一大堆棋子之后发现不对又都拿掉的情况,但是总体来看,如果需要全部的答案,需要枚举的次数还是不变的, 测试数据也说明了这点。

再说外循环从左到右,内循环从下到上要快一些的情况……

话说N皇后问题建模出来的矩阵,对于行约束,是大量相邻的行都一样的,而列约束是相邻的列都不一样的,这个是显而易见的。

外循环从左到右循环在搜索树的上层取到的大都是行约束,但是到了中层开始取到列约束,取到列约束之后,再枚举的行实际上都是在这个列约束的基础上的,然后就鬼使神差的出现了大量的无效枚举……丫的鬼知道为什么……

再来看看拼图问题……大概情况是选择了一块位置,然后放上一块图片,如果两者方向一样,就会出现大量的由于遇到同一块图片而达到的冲突……

由枚举全部则速度相同可以看出,这其实是一个概率问题,方向反掉之后出现大量冲突的概率变小了,但是总体来看,花费是一样的,而搜索这种东西本身很靠RP的……尤其是只需要一个答案的情况下……之所以随机化搜索……也是有一定道理……随机化就不容易出现大规模冲突的情况……总体趋向于平衡……

感觉自己都搞不清楚在说什么了……结论是DLX很神奇……枚举行的时候还是跟选择列反过来稍微好一些……