Python解决八皇后问题

问题描述

如何能在 8*8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了到达此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。

设计思路

采用回溯算法解决八皇后问题。即按行落子,第一行落子后,遍历第二行,寻找是否有可落子之处,如果无法落子,则返回第一行,调整第一行落子的位置。如此迭代,直至所有可能都遍历结束。此方法不是盲目地枚举,而是考虑冲突的可能,在性能上大大优于穷举法。

核心代码

注意,以下代码只是逻辑编程,并不涉及如判断能否落子这样的函数,需要读者自行编写。

import numpy as np     # 提供维度数组与矩阵运算 
import copy            # 从copy模块导入深度拷贝方法 
from board import Chessboard

# 基于棋盘类,设计搜索策略 
class Game:
    def init(self, show = True):
        """
        初始化游戏状态
        """

        self.chessBoard = Chessboard(show) 
        self.solves=[] 
        self.gameInit()

    # 重置游戏
    def gameInit(self, show = True):
    """
    重置棋盘
    """

    self.Oueen_setRow = [-1] * 8
    self.chessBoard.boardInit(False)

    def run(self,row=0):
        for col in range(8): #遍历同一行的8个列 
            if self.chessBoard.setLegal(row, col):           #如果该位置合法 
                self.chessBoard.setQueen(row, col, False)    #落子 
                self.Queen_setRow[row] = col                 #记录结果 
                if row == 7:                                 #说明8个皇后落子完毕 
                    temp= list(self.Queen_setRow) 
                    self.solves.append(temp)
                    return False                             #继续寻找下一种方案 
                if not self.run(row + 1):                    #递归,找下一行的落子点 
                                                             #如果下一行没有能成功的落子点
                    self.chessBoard.boardInit(False)         #重置棋盘 
                    for temp in range(row):                  #重绘棋盘,撤回这一行的落子点 
                        self.chessBoard.setQueen(temp, self.Queen_setRow[temp], False)
        return False                                         #遍历8个列后,查找失败 

    def showResults(self, result):
    """
    结果展示
    """

    self.chessBoard.boardInit(False) 
    for i item in enumerate(result):
        if item >= 0:
            self.chessBoard.setQueen(iitem, False)

    self.chessBoard.printChessboard(False)

    def get results(self):
    """
    输出结果
    return:八皇后的序列解的list.
    """

    self.run()
    return self.solves

game=Game()
solutions=game.get_results()
print('There are {} results.'.format(len(solutions)))
game.showResults(solutions[0])

实验结果

共有92种结果。以下展示部分:

 每一个结果以一个一维数组输出,纪录棋子应该放在每一行的哪一列。如第一个结果表示,棋子放在第一行第一列、第二行第五列、...、第八行第四列。

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值