八皇后问题 -- python面向对象解法
# 【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面向对象解法的更多相关文章
- C#中八皇后问题的递归解法——N皇后
百度测试部2015年10月份的面试题之——八皇后. 八皇后问题的介绍在此.以下是用递归思想实现八皇后-N皇后. 代码如下: using System;using System.Collections. ...
- 【算法】八皇后问题 Python实现
[八皇后问题] 问题: 国际象棋棋盘是8 * 8的方格,每个方格里放一个棋子.皇后这种棋子可以攻击同一行或者同一列或者斜线(左上左下右上右下四个方向)上的棋子.在一个棋盘上如果要放八个皇后,使得她们互 ...
- 八皇后问题C语言解法
偶遇八皇后问题,随即自己写了一个仅供参考 #include<stdio.h> #include<math.h> #define SIZE 8 void Circumsribe( ...
- 八皇后问题Python实现
八皇后问题描述 问题: 国际象棋棋盘是8 * 8的方格,每个方格里放一个棋子.皇后这种棋子可以攻击同一行或者同一列或者斜线(左上左下右上右下四个方向)上的棋子.在一个棋盘上如果要放八个皇后,使得她们互 ...
- 比赛组队问题 --- 递归解法 --- java代码 --- 八皇后问题
两队比赛,甲队为A.B.C3人,乙队为X.Y.Z3人.已知A不和X比,C不和X.Z比,请编程序找出3队赛手名单 采用了与八皇后问题相似的解法,代码如下: 如有疑问请链接八皇后问题的解法:http:// ...
- Python学习二(生成器和八皇后算法)
看书看到迭代器和生成器了,一般的使用是没什么问题的,不过很多时候并不能用的很习惯 书中例举了经典的八皇后问题,作为一个程序员怎么能够放过做题的机会呢,于是乎先自己来一遍,于是有了下面这个ugly的代码 ...
- Python 八皇后问题
八皇后问题描述:在一个8✖️8的棋盘上,任意摆放8个棋子,要求任意两个棋子不能在同一行,同一列,同一斜线上,问有多少种解法. 规则分析: 任意两个棋子不能在同一行比较好办,设置一个队列,队列里的每个元 ...
- Python解决八皇后问题的代码【解读】
八皇后问题 来自于西方象棋(现在叫 国际象棋,英文chess),详情可见百度百科. 在西方象棋中,有一种叫做皇后的棋子,在棋盘上,如果双方的皇后在同一行.同一列或同一斜线上,就会互相攻击. 八皇后问题 ...
- python基础教程总结8——特殊方法,属性,迭代器,生成器,八皇后问题
1. 重写一般方法和特殊的构造方法 1.1 如果一个方法在B类的一个实例中被调用(或一个属性被访问),但在B类中没有找到该方法,那么会去它的超类A里面找. class A: ... def hello ...
随机推荐
- DataFrame.loc的区间
df.loc[dates[0:1],'E']和df.loc[dates[0]:dates[1],'E']不同. 前者不包含dates[1],后者是包含dates[1]的. 根据Python3中实际代码 ...
- Eclipse 4.9 创建springboot项目步骤
上一篇文章写了eclipse安装STS. 现在创建Spring Starter Project 具体步骤如下: 1.等你安装好STS后,就在Eclipse > File >New 选择 ...
- cenos中的软件安装
在linux中安装flash: http://jingyan.baidu.com/article/fa4125accdeeec28ad709252.html linux java环境的搭建:
- (最小割)Path
http://acm.hdu.edu.cn/showproblem.php?pid=6582 思路:找到最短路核心边建图,跑一遍最小割,最短路核心边的定义为设起点到每个点的最短距离为d[i],每个点到 ...
- Largest Point
Largest Point Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tot ...
- hadoop平台搭建
前言 这是小的第一次搭建hadoop平台,写下这篇博客有以下几个目的(ps:本博只记录在linux系统下搭建hadoop的步骤,如果需要了解在其他平台上搭建hadoop的步骤,还请移步): 1.希望大 ...
- Http发送Json
public static JSONObject post(String url,JSONObject json){ HttpClient client = new DefaultHttpClient ...
- windows server IIS启用Windows authentication
双击打开IIS网站的authentication,如果有Windows authentication,直接右键启用即可,如果没有的话需要先安装一下Windows authentication,Micr ...
- 移动端rem布局屏幕适配插件(放js中便可使用)
/* doc:不用管:document对象 win:不用管:window对象 design:注意:设计稿的尺寸/物理像素*/ (function (doc, win,design) {// alert ...
- python爬虫学习之路-遇错笔记-1
当在运行爬虫时同时开启了Fidder解析工具时(此爬虫并不是用于爬取手机端那内容,而是爬去电脑访问的网页时),访问目标站点会遇到以下错误: File "C:\Users\litao\AppD ...