算法题(2) 八皇后问题

八皇后问题

  问题描述:八皇后问题是由国际西洋棋棋手马克斯·贝瑟尔于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.

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值