最近在学习Python,看了简明Python教程,又找了本《可爱的Python》来看。一本面向无编程基础人员的入门书。。在书的刚开始,就留了一道8皇后的问题。。。

  下面给出我的解法,如有问题请大家指正。

 1 #!/usr/bin/env python
 2 #coding=utf-8
 3 
 4 #为保证两个整数相除结果为浮点数
 5 from __future__ import division
 6 #定义棋盘
 7 board = [[0 for x in range(8)] for y in range(8)]
 8 #用于存放皇后位置
 9 queens = {}
10 #记录解的个数
11 total = 0
12 
13 def printBoard():
14     '''打印棋盘'''
15     for x in board:
16         print x
17     print
18 
19 def check(col,row):
20     '''检查(row,col)此位置是否可以放置皇后,row表示行,col表示列'''
21     #如果是第一列,则肯定可以放置皇后,返回True。
22     if col == 0:
23         return True
24     #因为我们是按列递增的顺序来放置皇后的,所以递增的key一定可以访问到每一个元素。
25     for k in range(col):
26         if row == queens[k] or (row-queens[k])/(col-k) == 1 or (row-queens[k])/(col-k) == -1:
27             return False
28     #循环结束,没有返回值,说明该位置不与存在的任一皇后在一条横线或对角线上,可放。
29     return True
30 
31 def getNextQueen(col):
32     for row in range(8):
33         if check(col,row):
34             #保存已放置皇后位置。
35             queens[col] = row
36             #在棋盘上标记位置,用于打印。
37             board[row][col] = 1
38             #如果是最后一列,则放下该位置后打印结果。
39             if col == 7:
40                 #计算解的个数
41                 global total
42                 total = total + 1
43                 printBoard()
44                 #最后一列可能不只一个位置有解,打印后删掉刚加入的皇后位置,清扫棋盘,接着循环找下一位置。
45                 del queens[col]
46                 board[row][col] = 0
47                 continue
48             #如果不是最后一列,则开始找下一列的皇后。
49             else:
50                 #如果下一列没有位置可以放置皇后,删掉最新的皇后,接着循环。
51                 if not getNextQueen(col + 1):
52                     del queens[col]
53                     board[row][col] = 0
54                     continue
55     return False
56 
57 getNextQueen(0)
58 print '共%d个解' % total