#-*-encoding:utf-8-*-
from itertools import permutations
from itertools import combinations
# 八皇后问题的python实现
MAX_COUNT = 8
square = None
# 组合
def cnn(data, deepth):
return [c for c in combinations(data, deepth)]
# 排列
def ann(data, deepth):
return list(permutations(data, deepth))
# 初始化棋盘, 共8 * 8格
def init():
global square
line = [0 for i in range(MAX_COUNT)]
square = [line.copy() for i in range(MAX_COUNT)]
# 落子到对应的坐标, point[0]为纵坐标, point[1]为横坐标, 返回落子后的square
def update(point):
x, y = point[0], point[1]
if check(point):
for i in range(8):
for j in range(8):
if (x - i) ** 2 == (y - j) ** 2 or x == i or y == j:
square[i][j] = 2
square[x][y] = 1
return True
else:
return False
# 检查落子是否合法, 若合法则返回True, 否则返回False
def check(point):
value = square[point[0]][point[1]]
if value != 1 and value != 2:
return True
return False
# 打印棋盘中的子
def print_square():
for i in square:
print(i)
# 主函数
def queen():
y_points = ann(range(8), 8) # 生成所有y坐标的排列
points = []
# 开始生成坐标集合
for y_point in y_points:
point = [(i, j) for i, j in enumerate(y_point)]
points.append(point) # 将y坐标排列转换成xy坐标
# 开始检验坐标是否合法
for point in points:
init() # 初始化棋盘
flag = 1
for p in point:
if not update(p):
flag = 0
break
if flag == 1:
print(point) # 如果合法, 则打印该坐标集合
print_square() # 打印皇后的摆放位置
queen()