# 【8*8棋盘八皇后问题】

 class Queen:
def __init__(self, row, col):
self.row = row
self.col = col
self.pos = (row + 1, col + 1) def check(self, chess_board):
'''检查当前位置是否可放置皇后,默认每行只放一个皇后'''
# 检测列
for i in range(8):
if chess_board.board[i][self.col] == 0:
return False
# 检测两个斜向
for i in range(-7, 8):
if 0 <= self.row + i < 8 and 0 <= self.col + i < 8 and chess_board.board[self.row + i][self.col + i] == 0:
return False
elif 0 <= self.row + i < 8 and 0 <= self.col - i < 8 and chess_board.board[self.row + i][self.col - i] == 0:
return False
return True class Chess_Board:
# 棋盘 无皇后为1,有皇后为0
board = [[1 for i in range(8)] for i in range(8)] def print_board(self):
'''可视化打印棋盘'''
print('---------------------------------')
for i in range(8):
for j in range(8):
if self.board[i][j] == 1:
print(' +', end='') # + 无皇后
else:
print(' @', end='') # @ 表示皇后
print()
print('---------------------------------') def solve():
'''返回结果棋盘对象和皇后对象列表''' def check_nextline(queens, chess_board):
'''已知所有皇后坐标,判断下一行是否有位置'''
next_col = len(queens)
if next_col < 8:
for i in range(8):
queen = Queen(next_col, i)
if queen.check(chess_board):
queens.append(queen)
chess_board.board[queen.row][queen.col] = 0
# chess_board.print_board() # 监控实现过程
return True
return False queens = [] # 存储已放到棋盘上的皇后对象的列表
chess_board = Chess_Board() # 创建唯一棋盘对象
queen = Queen(0, 0)
queens.append(queen)
chess_board.board[queen.row][queen.col] = 0
while 1:
# 如果下一行没有位置,就将该行的皇后向右移一格
while not check_nextline(queens, chess_board):
queen = queens.pop(-1)
chess_board.board[queen.row][queen.col] = 1
while queen.col == 7:
queen = queens.pop(-1)
chess_board.board[queen.row][queen.col] = 1 queen = Queen(queen.row, queen.col + 1)
# 如果皇后右移后与原先皇后冲突,则继续右移
while not queen.check(chess_board):
if queen.col < 7:
queen = Queen(queen.row, queen.col + 1)
else:
while queen.col == 7:
queen = queens.pop(-1)
chess_board.board[queen.row][queen.col] = 1 queen = Queen(queen.row, queen.col + 1)
queens.append(queen)
chess_board.board[queen.row][queen.col] = 0 # 放满8个皇后之后跳出while 1循环
if len(queens) == 8:
break
return queens, chess_board def main():
'''主函数'''
queens, chess_board = solve()
for queen in queens:
print(queen.pos)
chess_board.print_board() if __name__ == "__main__":
main()

八皇后问题 -- python面向对象解法的更多相关文章

  1. C#中八皇后问题的递归解法——N皇后

    百度测试部2015年10月份的面试题之——八皇后. 八皇后问题的介绍在此.以下是用递归思想实现八皇后-N皇后. 代码如下: using System;using System.Collections. ...

  2. 【算法】八皇后问题 Python实现

    [八皇后问题] 问题: 国际象棋棋盘是8 * 8的方格,每个方格里放一个棋子.皇后这种棋子可以攻击同一行或者同一列或者斜线(左上左下右上右下四个方向)上的棋子.在一个棋盘上如果要放八个皇后,使得她们互 ...

  3. 八皇后问题C语言解法

    偶遇八皇后问题,随即自己写了一个仅供参考 #include<stdio.h> #include<math.h> #define SIZE 8 void Circumsribe( ...

  4. 八皇后问题Python实现

    八皇后问题描述 问题: 国际象棋棋盘是8 * 8的方格,每个方格里放一个棋子.皇后这种棋子可以攻击同一行或者同一列或者斜线(左上左下右上右下四个方向)上的棋子.在一个棋盘上如果要放八个皇后,使得她们互 ...

  5. 比赛组队问题 --- 递归解法 --- java代码 --- 八皇后问题

    两队比赛,甲队为A.B.C3人,乙队为X.Y.Z3人.已知A不和X比,C不和X.Z比,请编程序找出3队赛手名单 采用了与八皇后问题相似的解法,代码如下: 如有疑问请链接八皇后问题的解法:http:// ...

  6. Python学习二(生成器和八皇后算法)

    看书看到迭代器和生成器了,一般的使用是没什么问题的,不过很多时候并不能用的很习惯 书中例举了经典的八皇后问题,作为一个程序员怎么能够放过做题的机会呢,于是乎先自己来一遍,于是有了下面这个ugly的代码 ...

  7. Python 八皇后问题

    八皇后问题描述:在一个8✖️8的棋盘上,任意摆放8个棋子,要求任意两个棋子不能在同一行,同一列,同一斜线上,问有多少种解法. 规则分析: 任意两个棋子不能在同一行比较好办,设置一个队列,队列里的每个元 ...

  8. Python解决八皇后问题的代码【解读】

    八皇后问题 来自于西方象棋(现在叫 国际象棋,英文chess),详情可见百度百科. 在西方象棋中,有一种叫做皇后的棋子,在棋盘上,如果双方的皇后在同一行.同一列或同一斜线上,就会互相攻击. 八皇后问题 ...

  9. python基础教程总结8——特殊方法,属性,迭代器,生成器,八皇后问题

    1. 重写一般方法和特殊的构造方法 1.1 如果一个方法在B类的一个实例中被调用(或一个属性被访问),但在B类中没有找到该方法,那么会去它的超类A里面找. class A: ... def hello ...

随机推荐

  1. Linux命令行工具之vmstat命令

    原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11484608.html vmstat是一款指定采样周期和次数的功能性监测工具,可以使用它监控进程上下文 ...

  2. URLEncode解决url中有特殊字符的问题

      问题:图片上传后的url地址中有&等特殊字符,页面传到后端时被自动处理成了&   解决:前端对url进行URLEncode,后端收到后进行URLDecode   总结:需要在请求u ...

  3. [原创] Delphi Win API函数 操作帮助文件 HtmlHelpA函数介绍

    Delphi Win API函数 操作帮助文件 HtmlHelpA函数介绍 函数原型:HWND HtmlHelpA( HWND hwndCaller, LPCSTR pszFile, UINT uCo ...

  4. HTTP通信安全和Web攻击技术

    一.HTTPS,确保Web安全 在HTTP协议中可能存在信息窃听或身份伪装等安全问题,HTTP的不足: 通信使用明文(不加密),内容可能会被窃听  不验证通信方的身份,因此有可能遭遇伪装 无法证明报文 ...

  5. Jenkins修改升级配置

    更换升级配置如下: http://mirror.esuni.jp/jenkins/updates/update-center.json

  6. 【Nacos】Nacos安装

    1.Nacos简介 Nacos是阿里巴巴集团开源的一个易于使用的平台,专为动态服务发现,配置和服务管理而设计.它可以帮助您轻松构建云本机应用程序和微服务平台. Nacos基本上支持现在所有类型的服务, ...

  7. 洛谷P1982 小朋友的数字

    题目传送门 这个题的题目有点长,我们先来分析一波. 首先,这个题目中提到了以下几个量 1.最直接的就是每个小盆友手上的数字,这是题目给你的 2.每个小盆友的特征值 题目中给的定义是:每个小朋友的特征值 ...

  8. CentOS 7.0 配置防火墙

    停用了 iptables. systemctl stop iptables.service 然后来启动 firewalld 吧 systemctl start firewalld.service 给我 ...

  9. webpack-使用html-webpack-plugin和ejs-loader将侧栏、头部、底部公共html做成模板,并生成合并后的html页面

    在学习前端自动化之前一直使用 PHP,JSP 将在每个页面将头部.侧栏.底部等部分引入,现在前端 "娱乐圈" 一直噼里啪啦的每天出新东西,自从接触了前端自动化我就觉得这种工作可以交 ...

  10. HTML 解析类库HtmlAgilityPack

    1. HtmlAgilityPack简介 网站中首先遇到的问题是爬虫和解析HTML的问题,一般情况在获取页面少量信息的情况下,我们可以使用正则来精确匹配目标.不过本身正则表达式就比较复杂,同时正则表达 ...