问题描述
Python2.7编写
#N皇后问题
def put_queen(x,y,times):
result = 0
if times > MAXQUEEN: #终止条件
return 1
else:
if place(x,y): #检查是否可以放置皇后
pad[x][y] = 1 #放置皇后
for i in range(MAXQUEEN):
for j in range(MAXQUEEN):
#递归调用放置下一个皇后
result += put_queen(i, j, times + 1)
if result > 0:
break
if result > 0: #找到了解
return 1
else:
pad[x][y] = 0 #清除皇后
return 0
else:
return 0
#检查皇后是否相互攻击
def place(x,y):
if pad[x][y] != 0: #已放置皇后
return 0
x1 = x + 1 #检查右下方
y1 = y + 1
while x1 < MAXQUEEN and y1 < MAXQUEEN:
if pad[x1][y1] != 0:
return 0
else:
x1 += 1
y1 += 1
x1 = x - 1 #检查左上方
y1 = y - 1
while x1 >= 0 and y1 >= 0:
if pad[x1][y1] != 0:
return 0
else:
x1 -= 1
y1 -= 1
x1 = x + 1 #检查左下方
y1 = y - 1
while x1 < MAXQUEEN and y1 >= 0:
if pad[x1][y1] != 0:
return 0
else:
x1 += 1
y1 -= 1
x1 = x - 1 #检查右上方
y1 = y + 1
while x1 >= 0 and y1 < MAXQUEEN:
if pad[x][y] != 0:
return 0
else:
x1 -= 1
y1 += 1
x1 = x #检查右方
y1 = y + 1
while y1 < MAXQUEEN:
if pad[x1][y1] != 0:
return 0
else:
y1 += 1
x1 = x #检查左方
y1 = y - 1
while y1 >= 0:
if pad[x1][y1] != 0:
return 0
else:
y1 -= 1
x1 = x + 1 #检查下方
y1 = y
while x1 < MAXQUEEN:
if pad[x1][y1] != 0:
return 0
else:
x1 += 1
x1 = x - 1 #检查上方
y1 = y
while x1 >= 0:
if pad[x1][y1] != 0:
return 0
else:
x1 -= 1
return 1
# 输出棋盘图形的函数
def printPad(pad):
for i in range(MAXQUEEN):
for j in range(MAXQUEEN):
print pad[i][j],
print "\n"
if __name__ == "__main__":
MAXQUEEN = 8 #最大放置的皇后数
# N * N的棋盘,这里N = 8
pad = [[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0]]
put_queen(0,0,1) #调用递归函数
printPad(pad) #输出棋盘的图形
输出:
1 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 1
0 0 0 0 0 0 1 0
0 0 0 1 0 0 0 0
0 1 0 0 0 0 0 0
0 0 0 0 1 0 0 0
写在后面:
这是8皇后问题的一个放置方案。
问题描述部分摘自《数据结构C语言》台湾版