由于八皇后问题很著名不再详述,直接贴代码:
1 import random 2 3 #判断是否冲突的函数 4 def conflict(state,nextX): 5 nextY=len(state) 6 for i in range(nextY): 7 if abs(state[i]-nextX) in (0,nextY-i): 8 #abs(state[i]-nextX)等于0表示在同一行,abs(state[i]-nextX)等于nextY-i表示在同一列 9 return True 10 return False 11 12 def queens(num,state=()): 13 #假设剩最后一个皇后没有位置时(对应当前皇后),遍历所有位置返回没有冲突的位置 14 for pos in range(num): 15 if not conflict(state, pos): 16 if len(state)==num-1: 17 yield(pos,) 18 #当元组只有一个元素时应该加, 19 else: 20 for result in queens(num, state+(pos,)): 21 yield(pos,)+result 22 23 24 def prettyprint(solution): #输出皇后问题的矩阵 ,Q表示皇后的位置 25 def line(pos,length=len(solution)): 26 return 'X'*(pos)+'Q'+'X'*(length-1-pos) 27 for pos in solution: 28 print line(pos) 29 30 if __name__=='__main__': 31 prettyprint(random.choice(list(queens(8)))) 32 #由于queens生成多种解决方案,random模块的choice方法会从一个有序类型中随机选一个
输出结果:
QXXXXXXX
XXXXXXQX
XXXQXXXX
XQXXXXXX
XXQXXXXX
XQXXXXXX
XXXXQXXX
XXXXXQXX