#!/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))))