“八皇后问题”的 Python 语言解法

本文介绍了使用 Python 编程解决经典八皇后问题的过程,探讨了如何在棋盘上放置八个皇后,使得任意两个皇后都无法在同一行、同一列或同一斜线上。
摘要由CSDN通过智能技术生成

        学习 Python 的过程中的一次编码练习。

#! /usr/bin/env python

__metaclass__ = type

class Chessboard:
    board = []
    def __init__(self, queens):
        """the constructor function of Chessboard class"""
        for site in range(queens):
            self.board.append(-1)
        self.arrangements = 0
    def __getitem__(self, index):
        """overloaded const int& operator[] const"""
        return self.board[index]
    def __setitem__(self, index, value):
        """overloaded non-const int& operator[]"""
        self.board[index] = value
    def addCount(self):
        """++arrangements"""
        self.arrangements += 1
    def getCount(self):
        """return arrangements"""
        return self.arrangements

def show(board, queens):
    """show the result"""
    board.addCount()
    print '-------------------------------------'
    print '--> Arrangement index', board.getCount()
    for ix in range(queens):
        print '(%d, %d)' % (ix, board[ix]),
        if ix == queens - 1:
            print

def conflict(board, site):
    """check whether the site can be placed on the board"""
    for ix in range(site):
        if board[ix] == board[site]:
            return True
        if abs(board[ix] - board[site]) == site - ix:
            return True
    return False
    
def put(board, site, queens):
    """depth first algorithm"""
    for ix in range(queens):
        board[site] = ix
        if not conflict(board, site):
            if site == queens - 1:
                show(board, queens)
            else:
                put(board, site + 1, queens)

def Queens():
    """N-Queens Problem Solver"""
    queens = input('Queens: ')
    checkerboard = Chessboard(queens)
    put(checkerboard, 0, queens)
    print '-------------------------------------'
    print '--> total arrangements:', checkerboard.getCount()

Queens()


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值