# 【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. LeetCode--040--组合总和 II(java)

    给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的每个数字在每个组合中只能使用一次. ...

  2. 【HDOJ6699】Block Breaker(模拟)

    题意:给定一个n*m的网格块,如果一个块水平或垂直方向没有相邻支撑就会掉下去 有q次询问,每次会掉下去一块,问连锁反应新掉下的块数 n,m<=2e3,q<=1e5 思路: #include ...

  3. 【HDOJ6665】Calabash and Landlord(dfs)

    题意:二维平面上有两个框,问平面被分成了几个部分 x,y<=1e9 思路:分类讨论可以 但数据范围实在太小了,离散化以后随便dfs一下 #include<bits/stdc++.h> ...

  4. 纯css实现瀑布流(multi-column多列及flex布局)

    瀑布流的布局自我感觉还是很吸引人的,最近又看到实现瀑布流这个做法,在这里记录下,特别的,感觉flex布局实现瀑布流还是有点懵的样子,不过现在就可以明白它的原理了 1.multi-column多列布局实 ...

  5. MatrixTraceTransform主要逻辑在transform方法中

    @Override public void transform(TransformInvocation transformInvocation) throws TransformException, ...

  6. Hibernate入门学习笔记

    1.Hibernate是什么? 2.hibernate怎么配置? 3.SessionFactory是干什么的?有哪些方法经常用? 4.hibernate的现成的增删改查方法怎么使用?都有哪些方法?哪些 ...

  7. Codeforecs Round #425 D Misha, Grisha and Underground (倍增LCA)

    D. Misha, Grisha and Underground time limit per test 2 seconds memory limit per test 256 megabytes i ...

  8. MySQL case when then else end用法

    链接:https://blog.csdn.net/konglongaa/article/details/80250253 case具有两种格式,简单case函数和case搜索函数. 1.简单case函 ...

  9. 【C#学习笔记】string.Format对C#字符串格式化

    文章转自:CSDN   http://blog.csdn.net/samsone/article/details/7556781 1.格式化货币(跟系统的环境有关,中文系统默认格式化人民币,英文系统格 ...

  10. Parameter Initializations in Deep Learning

    全零初始化的问题: 在Linear Regression中,常用的参数初始化方式是全零,因为在做Gradient Descent的时候,各个参数会在输入的各个分量维度上各自更新.更新公式为: 而在Ne ...