python解决八皇后问题的方法

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018/9/11 15:40
# @Author  : Lijinjin
# @Site    : 
# @File    : testQueens.py
# @Software: PyCharm

def conflict(state,nextX):


    '''
    :param state: state[] = {1,3,0,2}则表示皇后的位置分别在第一行第一个,第二行第三个,第三行第0个,第四行第2个
    state[i]表示列位置,已存在皇后的位置,后来的皇后与之比较
    :param nextX:nextX表示皇后的水平位置
    :return:是否冲突
    '''
    nextY = len(state)  # 代表垂直位置
    for i in range(nextY):
        if abs(state[i]-nextX)in (0,nextY-i):
            return True
    return False


def queens(num=4,state=()):
    for pos in range(num):
        if not conflict(state,pos):
            if len(state)==num-1:
                yield (pos,)
            else:
                '''
                1.这里循环是为了将找到的位置通过下面的代码,加入到结果中。每一层执行都会加入新的元素
                2.result就是为了拿到以前已有的位置,然后再加入函数最新计算出的pos(计算出之后并未立即加入的结果元组中)
                3.在没有将皇后摆满的情况下,一旦发现皇后在当前行没用位置摆放,当层的函数即向上层返回,改变上层的pos值
                '''
                for result in queens(num,state+(pos,)): # 这里循环是为了将找到的位置通过下面的代码,加入到结果中。每一层执行都会加入新的
                    yield (pos,)+result



print(list(queens(4)))
print(len(list(queens(4))))


def prettyprint(solution):
    def line(pos,length=len(solution)):
        return '. '*(pos)+'X '+'. '*(length-pos-1)
    for pos in solution:
        print(line(pos))

import random
prettyprint(random.choice(list(queens(4))))

 

posted @ 2018-09-12 10:42  路在脚下丶  阅读(488)  评论(0编辑  收藏  举报