【题目】
N皇后问题;在N*N的棋盘上摆放皇后,皇后不能被其他皇后吃掉。
【解】
def num1(n):
if n<1:
return 0
record = [0]*n
return process1(0,record,n)
def process1(i,record,n):
if i == n :
return 1
res = 0
for j in range(n):
if isValid(record,i,j):
record[i] = j
res += process1(i+1,record,n)
return res
def isValid(record,i,j):
for k in range(i):
if (j == record[k]) or (abs(record[k]-j) == abs(i-k)):
return False
return True
创建大小为n的列表。列表的每一项表示,在index值的行数下,皇后应该放在第几列。比如,record[0] = 1,表示在棋盘第一行第1列有一个皇后。
process1函数用来放置皇后。即,如果有合适的位置放置皇后,会递归调用process1,使行数加1。res变量用来存放有多少种方式。
isValid函数用来判断新的皇后放在此处是否合理,也就是说,如果新的皇后与上一行皇后在同一列或者在对角线上,即为False,否则为True
def conflict(state,nextX):
nextY = len(state)
for i in range(nextY):
if abs(state[i]-nextX) in (0,nextY-i):
return True
return False
def Queen(num,state = ()):
for pos in range(num):
if not conflict(state,pos):
if len(state) == num -1:
yield (pos,)
else:
for result in Queen(num,state + (pos,)):
yield (pos,) + result
第二种方式同样是采用递归方法,只是最后返回的是模拟棋盘放置的方法。