Python

Python学习之八皇后

2016-10-27  本文已影响0人  JKTree

代码均来自《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

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

题外话:

    用简书写好难写啊。

上一篇下一篇

猜你喜欢

热点阅读