八皇后问题
在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问一共有多少种摆法。
#!/bin/python3
'''
检查如果在(row,col)放置皇后,是否与之前的皇后能够相互攻击
size: 棋盘大小size * size大小
pos: list数组,存储已经放置的皇后的位置,元素为{"row": x, "col": y}
row: 新皇后的x坐标
col: 新皇后的y坐标
'''
def check_conflict(size, pos, row, col):
for mem in pos:
r1 = mem["row"]
c1 = mem["col"]
if(col == c1):
return 1
if(row-r1 == col-c1):
return 1
if(row-r1 == c1-col):
return 1
return 0
'''
递归方法寻找结果集
size: 棋盘大小size * size大小
pos: list数组,存储已经放置的皇后的位置,元素为{"row": x, "col": y}
row: 扫描row一行所有位置,看是否有解
record: 若果有解,记录结果集
'''
def putQueen(size, pos, row, record):
#row==size时,表示在size*size棋盘上已经放置了size个皇后,有解,并将记录皇后位置的结果保存到record
if(row == size):
record.append(pos)
return 1
ret = pos
#依次扫描row上的所有位置
for col in range(size):
#检查在(row,col)放置一个皇后,是否能够攻击之前已经放置的皇后
if(check_conflict(size, pos, row, col) == 1):
continue
#在(row,col)的皇后可以放置,记录下此时的位置
tmp_pos = pos.copy()
new_mem = {}
new_mem["row"] = row
new_mem["col"] = col
tmp_pos.append(new_mem)
#放置下一行的皇后
rc = putQueen(size, tmp_pos, row+1, record)
#rc==0,表示row+1行无法放置皇后,无解,扫描下一个点
if(rc == 0):
continue
#rc!=0表示有解
#return 1 #如果只需要找一种解,此处返回1即可
#扫描完所有结果返回,此处返回值无关紧要
return 1
def printResult(pos, size):
for mem in pos:
ch = "*"
col = mem["col"]
for i in range(size):
if(i == col):
ch = "A"
else:
ch = "*"
print(" %s " % (ch), end='')
print("\n")
#可以改成n皇后问题
size = 8
pos = []
row = 0
record = []
ret = putQueen(size, pos, row, record)
print(len(record))
for i in range(len(record)):
printResult(record[i], size)
print("====================")
结果:
92