八皇后问题 -- python面向对象解法

  1 # 【8*8棋盘八皇后问题】
  2 
  3 class Queen:
  4     def __init__(self, row, col):
  5         self.row = row
  6         self.col = col
  7         self.pos = (row + 1, col + 1)
  8 
  9     def check(self, chess_board):
 10         '''检查当前位置是否可放置皇后,默认每行只放一个皇后'''
 11         # 检测列
 12         for i in range(8):
 13             if chess_board.board[i][self.col] == 0:
 14                 return False
 15         # 检测两个斜向
 16         for i in range(-7, 8):
 17             if 0 <= self.row + i < 8 and 0 <= self.col + i < 8 and chess_board.board[self.row + i][self.col + i] == 0:
 18                 return False
 19             elif 0 <= self.row + i < 8 and 0 <= self.col - i < 8 and chess_board.board[self.row + i][self.col - i] == 0:
 20                 return False
 21         return True
 22 
 23 
 24 
 25 class Chess_Board:
 26     # 棋盘  无皇后为1,有皇后为0
 27     board = [[1 for i in range(8)] for i in range(8)]
 28 
 29     def print_board(self):
 30         '''可视化打印棋盘'''
 31         print('---------------------------------')
 32         for i in range(8):
 33             for j in range(8):
 34                 if self.board[i][j] == 1:
 35                     print(' +', end='') # + 无皇后
 36                 else:   
 37                     print(' @', end='') # @ 表示皇后
 38             print()
 39         print('---------------------------------')
 40 
 41 
 42 
 43 def solve():
 44     '''返回结果棋盘对象和皇后对象列表'''
 45     
 46     def check_nextline(queens, chess_board):
 47         '''已知所有皇后坐标,判断下一行是否有位置'''
 48         next_col = len(queens)
 49         if next_col < 8:
 50             for i in range(8):
 51                 queen = Queen(next_col, i)
 52                 if queen.check(chess_board):
 53                     queens.append(queen)
 54                     chess_board.board[queen.row][queen.col] = 0
 55                     # chess_board.print_board() # 监控实现过程
 56                     return True
 57         return False
 58     
 59 
 60     queens = [] # 存储已放到棋盘上的皇后对象的列表
 61     chess_board = Chess_Board() # 创建唯一棋盘对象
 62     queen = Queen(0, 0)
 63     queens.append(queen)
 64     chess_board.board[queen.row][queen.col] = 0
 65     while 1:
 66         # 如果下一行没有位置,就将该行的皇后向右移一格
 67         while not check_nextline(queens, chess_board):
 68             queen = queens.pop(-1)
 69             chess_board.board[queen.row][queen.col] = 1
 70             while queen.col == 7:
 71                 queen = queens.pop(-1)
 72                 chess_board.board[queen.row][queen.col] = 1
 73             
 74             queen = Queen(queen.row, queen.col + 1)
 75             # 如果皇后右移后与原先皇后冲突,则继续右移
 76             while not queen.check(chess_board):
 77                 if queen.col < 7:
 78                     queen = Queen(queen.row, queen.col + 1)
 79                 else:
 80                     while queen.col == 7:
 81                         queen = queens.pop(-1)
 82                         chess_board.board[queen.row][queen.col] = 1
 83 
 84                     queen = Queen(queen.row, queen.col + 1)
 85             queens.append(queen)
 86             chess_board.board[queen.row][queen.col] = 0
 87 
 88         # 放满8个皇后之后跳出while 1循环
 89         if len(queens) == 8:
 90             break        
 91     return queens, chess_board
 92     
 93     
 94 
 95 def main():
 96     '''主函数'''
 97     queens, chess_board = solve()
 98     for queen in queens:
 99         print(queen.pos)
100     chess_board.print_board()
101 
102 
103 if __name__ == "__main__":
104     main()

 

posted @ 2019-07-09 14:41  Amadues  阅读(297)  评论(0编辑  收藏  举报