美文网首页Python
Python学习之八皇后

Python学习之八皇后

作者: JKTree | 来源:发表于2016-10-27 12:12 被阅读0次

    代码均来自《Python基础教程(第二版修订版)》第九章,注释均是自己对八皇后的理解

    state表示目前所取到的所有八皇后的位置,数组位置表示y轴(第几行),数组位置对应值对应x轴(表示第几列)。nextX表示下一行第几个位置(nextX跟nextY理解成x轴y轴,方便理解)

    defconflict(state, nextX):

        /* 获取下一个是第几行 */

        nextY = len(state) 

        for i in range(nextY):

        /*state[i]是表示x轴上的点,因为nextX是会由0开始数数,数到符合条件或者到达最大边界,就停止了。

          * 符合的条件:不在同一条x轴上,如果state[i]-nextX == 0 则是x轴相同,而 i则是i代表y轴由0开始遍历,nextY - i 则表示不在一条对角线上,至于为什么nextY - 1 == state[i] - nextX就不在一条对角线上,则可以想象成一条与x轴y轴都会相交的直线,简化成x - y = c 与x + y = c,根据位置带入等式就行了(这里你可能会迷糊,其实对角线就是根据当c=0的时候穿过坐标系原点(0,0)且成45度角,我们要确保的是等式的c不相同,故而任意的两个点,或者说任意的两个皇后的xy的位置互相减不能相等(就是|x1 - x2| != |y1 - y2|),相等的话必然c相等),理解了下面的代码就看懂了,还迷糊就自己画图吧,哈哈哈 */

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

                return True

        return False

    /* pos 可以理解为x轴上的点,但是y轴呢?每找出一个点,点在state的位置就是y轴了 ,比如state[i] = pos*/

    def queens(num = 8, state = ()):

        for pos in range(num):

            if not conflict(state, pos):

                if len(state) == num - 1:

                    yield (pos,)

                else:

                    for result in queens(num, state + (pos,)):

                          yield (pos,) + result

    必要的解释都给了,转载请注明

    题外话:

        用简书写好难写啊。

    相关文章

      网友评论

        本文标题:Python学习之八皇后

        本文链接:https://www.haomeiwen.com/subject/uowjuttx.html