scheme来实现八皇后问题(2)

 

版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖。如要转贴,必须注明原文网址
 
upload/201810171150021537.png" alt="" style="border: 0px; max-width: 580px; height: auto;" />

 

  字符串的大小比较,大家应该都很熟。

  两个字符串从头逐位比较,过程中,对应位的字符相等则继续比较,直到过程中一个字符串先到尾部或者字符上分出大小,先到尾部或者对应位上的字符小的一方的字符串较小,另一个字符串则较大。如果两个字符串同时都检测到了尾部,那么两个字符串当然一模一样,则为相等。

  C语言中字符串比较可以用strcmp函数,而Scheme里字符串比较可以用 string=?  string>? 等函数。

  但是,我们这里是要对于所有排列按照字典顺序检测,可是这里每个排列是一个数字组成的list,那么我们可以按照数字的大小来替代之前字符串比较时的字符大小,就可以做到字典序列了。

 

  比如1~3的全排列一共有6个排列,按照字典顺序从小到大本应该如下:

  (1 2 3)

  (1 3 2)

  (2 1 3)

  (2 3 1)

  (3 1 2)

  (3 2 1)

  

  但考虑到列表的特殊结构,我们判断两个排列的大小从最后一位开始看的话(也就是列表反过来看),在这里因为一路可以使用cons/car/cdr而不是append/take/drop之类相对复杂的递归,从而要方便很多,效率也要高,于是上述1~3的全排列按照字典顺序会如下:

  (3 2 1)

  (2 3 1)

  (3 1 2)

  (1 3 2)

  (2 1 3)

  (1 2 3)

 

 

  实际的例子

 

  我们需要实际来看看按照字典序列并加上之前的剪枝思路如何完成完整的解答。

  在这里,我们可以用4皇后来作为i例子。

  

  我们试图要用迭代完成我们的检测,用当前检测的列表和已有的解合成迭代的状态

  最开始的时候,我们要检测的list是空列,而解初始也为一个空列

  目前                                    说明

  ()                         ()                 初始

关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信