八皇后问题
问题描述:八皇后问题是由国际西洋棋棋手马克斯·贝瑟尔于1848年提出的问题,其表述为:在8×8的标准国际象棋棋盘上摆放8个皇后,使任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
思想:不难想出,符合要求的摆法一定是每行有且仅有一个皇后棋子。因此从第一行开始,尝试在每一行的每个位置摆放皇后,每摆放一次便检查已经摆放的所有棋子是否符合要求,符合时继续摆放下一个棋子,否则调整当前棋子。
代码实现如下:
# encoding=utf-8
import copy
class solution:
def __init__(self, n):
self.chessboard = []
self.set = []
self.results = 0
self.num = n
self.eight_empresses_reduced()
def check(self, chessboard, m, n):
col = m
for i in range(n):
coli = chessboard[i].index(1)
if coli == col : return 0
elif n-i == abs(coli-col) : return 0
return 1
def action(self, n):
if n == self.num:
self.results += 1
else:
for i in range(self.num):
if self.check(self.chessboard, i, n) == 0:
self.chessboard[n][i] = 0
continue
else:
self.chessboard[n][i] = 1
self.action(n + 1)
self.chessboard[n][i] = 0
def eight_empresses(self):
row = [0]*self.num
for i in range(self.num) :
self.chessboard.append(copy.deepcopy(row))
self.action(0)
f __name__ == '__main__':
emp = solution(11)
print(emp.results)
程序执行后输出正确结果:92.