17. Python脚本学习笔记十七Python的八皇后问题

来源:互联网 发布:vue js 折叠面板例子 编辑:程序博客网 时间:2024/06/05 22:18

17. Python脚本学习笔记十七Python的八皇后问题

本篇名言:“做官是一张纸,做人是一辈子;金钱是一张纸,健康是一辈子;夫妻是一张纸,感情是一辈子;荣誉是一张纸,朋友是一辈子!”

我们接下去看下如何使用生成器来解决实际问题,这里以八皇后问题为例。八皇后问题在数据结构笔记中有一节描述,采用C语言来解决该会提,我们来Python解决是否会更高效。

八皇后问题在此不再啰嗦了,网络上有一大堆,可以参考


yield关键字用来定义生成器(Generator),可以当return使用,它从函数里返回一个值,不同之处是用yield返回之后,可以让函数从上回yield返回的地点继续执行。直到yield语句再返回一个新的值。

1.  碰撞检测

如下:

defconflict(state,nextX):

    nextY=len(state)

    for iinrange(nextY):

        if abs(state[i]-nextX)in(0,nextY-i):

            returnTrue

    returnFalse

nextX,nextY表示下一个皇后的横坐标和纵坐标。

State是存放前面皇后的位置信息的元组。

 

完整代码如下:

defconflict(state, nextX):

    nextY = len(state)

    for iinrange(nextY):

        if abs(state[i]-nextX)in(0, nextY-i):

            returnTrue

    returnFalse

    

defqueens(num=8,state=()):

    for posin range(num):

        ifnotconflict(state, pos):

            if len(state) == num-1:

                yield (pos,)

            else:

                for resultin queens(num,state + (pos,)):

                    yield  (pos,)+result

printlist(queens(8,state=())) 

printlen(list(queens(8,state=())))    

短短十几行代码就实现了

其中包含了回溯和迭代,需要慢慢品味。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

原创粉丝点击