算法题(1) 八皇后问题

八皇后问题

  问题描述:八皇后问题是由国际西洋棋棋手马克斯·贝瑟尔于1848年提出的问题,其表述为:在8×8的标准国际象棋棋盘上摆放8个皇后,使任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

  思想:不难想出,符合要求的摆法一定是每行有且仅有一个皇后棋子。因此从第一行开始,尝试在每一行的每个位置摆放皇后,每摆放一次便检查已经摆放的所有棋子是否符合要求,符合时继续摆放下一个棋子,否则调整当前棋子。

  代码实现如下:

# encoding=utf-8

class empresses():

    def __init__(self):
        self.chessboard = [[0] * 8, [0] * 8, [0] * 8, [0] * 8, [0] * 8, [0] * 8, [0] * 8, [0] * 8]
        self.num = 0
        self.action(self.num)

    def check(self, chessboard, n):
        col = chessboard[n].index(1)
        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 == 8 :
            self.num += 1

        else :
            for i in range(8) :
                self.chessboard[n][i] = 1
                if self.check(self.chessboard, n) == 0 :
                    self.chessboard[n][i] = 0
                    continue
                else:
                    self.action(n+1)
                    self.chessboard[n][i] = 0

if __name__ == '__main__':
    emp = empresses()
    print(emp.num)

程序执行后输出正确结果:92.

你可能感兴趣的:(算法题)