八皇后问题 -- 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 ...
随机推荐
- Linux下安装Python,以及环境变量的配置
1.安装环境 centos7 + vmware + xshell 2.安装Python3 2.1下载Python资源包 网址:https://www.python.org/downloads/re ...
- MATLAB 和 armadillo 数据转换
#include<iostream> #include<armadillo> int D=5; int M=4; int main() { arma::fmat x; x.ra ...
- Nginx-配置负载均衡实例
配置负载均衡实例 实现效果: 配置负载均衡 实验代码 1) 首先准 备两个同时启动的 Tomcat 2) 在 nginx.conf 中进行配置 随着互联网信息的爆炸性增长,负载均衡(load bala ...
- Linux命令行工具之vmstat命令
原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11484608.html vmstat是一款指定采样周期和次数的功能性监测工具,可以使用它监控进程上下文 ...
- OC + RAC (十) 常用宏
. RAC(TARGET, [KEYPATH, [NIL_VALUE]]) :用于给某个对象的某个属性绑定. // 只要文本框文字改变,就会修改label的文字 RAC(self.labelView, ...
- myeclipse web project 名字可以包含中文吗?
1.理论上是可以有中文名的,但是由于中文因为编码的原因导致不可预料的后果,所以一般不建议使用中文名称 2. Myeclipse中修改Web项目名字的方法 方法一:新建项目法(有效的备份原来的项目) ...
- form表单action带参数传递
form表单action带参数传递function submit(){ var u = document.forms[0].elements["user"].value; do ...
- scrapy之Request对象
我们在使用scrapy框架的时候,会经常疑惑,数据流是怎么样在各个组件中间传递的.最近经常用scrapy+selenium爬取淘宝,又因为今天周五心情好,本宝宝决定梳理一下这方面知识. scrapy中 ...
- Windows7系统C盘空间不足
C盘要满了,用WizTree发现:;两个大文件, ①睡眠有关的,用命令提示符(管理员身份运行), 命令窗口中输入 powercfg -h off,即可关闭休眠功能,同时 Hiberfil.sys 文件 ...
- 关于TCP\IP协议的简单理解
一: HTTP是基于TCP协议的,TCP属于传输层.HTTP属于应用层. 另一个属于传输层的是UDP协议. 但HTTP是基于TCP这个协议,不是UDP这个协议. TCP相比于UDP,更安全,稳定.因为 ...