python的八皇后实现方法

#-*-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()


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值