# 【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()

最新文章

  1. Android探索之Service全面回顾及总结
  2. [译文]通过ID, TagName, ClassName, Name, CSS selector 得到element
  3. python 传参open
  4. 【java】:常用工具类
  5. 【leetcode】Isomorphic Strings(easy)
  6. mysql存储过程出参入参,sqlserver很熟悉的一件事到mysql,捣鼓了大半天。记录一下提醒自己。勿看
  7. html5中的表单
  8. leetcode 37 Sudoku Solver java
  9. jQuery 学习笔记(未完待续)
  10. Android入门教程之我见
  11. Android 上多方式定位元素(python)
  12. JBPM4.4 基本使用
  13. linux 硬盘满了如何处理
  14. 常用sql语句总结(二)(更新数据,序列,创建数据表,约束,注释)
  15. mac新手使用
  16. 从零开始学 Web 之 JavaScript(二)变量
  17. 玩弄 python 正则表达式
  18. Vim/Vi的使用
  19. Mysql表连接查询
  20. Laravel框架中Validor中错误信息$error的输出

热门文章

  1. OC + RAC (四) combineLatest和merg
  2. UITextField 长按文本框指定删除某个位置内容
  3. B/S上传整个文件夹
  4. 29 基于PCL的点云平面分割拟合算法技术路线(针对有噪声的点云数据)
  5. Transaction 在同一个类中不生效
  6. C#使用phantomjs 进行网页整页截屏
  7. vue项目适应不同屏幕做的适配器
  8. 问题记录-java图片验证码显示乱码
  9. 【Pytest】python单元测试框架pytest简介
  10. IBatis.Net 下使用SqlBulkCopy 大批量导入数据 问题解决