Python学习之八皇后

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

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

题外话:

    用简书写好难写啊。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,768评论 0 33
  • 1. tf函数 tensorflow 封装的工具类函数 | 操作组 | 操作 ||:-------------| ...
    南墙已破阅读 5,212评论 0 5
  • 春的孩子 (1) “早晨暖风刮不到大殿旁的高台——那里是夜风停留的地方。” 国王孤寂地站在那里,他的身边空荡荡的。...
    Gawaine阅读 1,416评论 5 9
  • By萨提亚(Virginia Satir) 我想爱你而不用抓住你 欣赏你而不须批判你 和你齐参与而不会伤害你 邀请...
    辛艳平阅读 1,007评论 0 0
  • 从踏出校园到今天,已经8个月了,在这8个月里总是充满了心酸,在校园里我们都像生活在象牙塔里,不用为找到一份与专业相...
    Hylen阅读 301评论 0 1