python 解决八皇后问题

  由于八皇后问题很著名不再详述,直接贴代码:

 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

posted @ 2013-07-06 20:06  lkprof  阅读(423)  评论(0编辑  收藏  举报