最近在学习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
浙公网安备 33010602011771号