n皇后问题是大家都很熟悉的。根据n的不同和题目要求的不同有很多解法,比如:简单的年历回溯法,根据对称性,用位运算或者dancing_links做标记……
但对于这道题,我们发现n达到了前所未有的300!不过还好只是求一个可行解,所以还是有突破口的。
想象一下,在没有计算机的情况下,我们应该怎样达到目标?手工回溯?显然不可能!我们会先构造出一个“看似基本可行”的状态,然后层层逼近地去试着调整。于是,这就是我们接着道题的思路——我们把这种方法叫做“启发性修补”。
既然提示到这里了,我想实现就很简单了。但这种启发性修补的思想并非所有人敢大胆尝试的。其实,这种运用随机生成状态,通过多次修补的方法还是很不错的。原因如下:
1.题目的可行解随着输入规模的增大也是增大的。也就是说你成功的可能数是很多的!
2.启发性修补采用的是尽可能多地操作,而非追求每次操作的完美性。但即便如此,借助于计算机强大的计算能力,我们可以尽可能使尝试次数达到最大,以达到目标。
3.当我们不随机化种子时,搜索的效率很稳定。实际的每步操作的效率可以接近为期望。这样就发现实际可行的操作次数内基本可以得到解。
如果我们用这种方法,即便n达到了500、1000、2000……我们也可以轻松应对!
当然,此题还有巧妙的构造法!