class Game: def __init__(self, show=True): """ 初始化游戏状态. """ self.chessBoard = Chessboard(show) self.solves = [] self.queen = np.zeros((8, 8), dtype=np.int8) self.gameInit() # 重置游戏 def gameInit(self, show=True): """ 重置棋盘. """ self.Queen_setRow = [-1] * 8 self.chessBoard.boardInit(False) ############################################################################## #### 请在以下区域中作答(可自由添加自定义函数) #### #### 输出:self.solves = 八皇后所有序列解的list #### #### 如:[[0,6,4,7,1,3,5,2],]代表八皇后的一个解为 #### #### (0,0),(1,6),(2,4),(3,7),(4,1),(5,3),(6,5),(7,2) #### ############################################################################## # # def check(self, x, y): for i in range(x): if self.queen[i][y] == 1: return False for i, j in zip(range(x - 1, -1, -1), range(y - 1, -1, -1)): if self.queen[i][j] == 1: return False for i, j in zip(range(x - 1, -1, -1), range(y + 1, 8)): if self.queen[i][j] == 1: return False return True def dfs(self, row=0): if row > 7: self.solves.append(copy.deepcopy(self.Queen_setRow)) return for col in range(8): if self.check(row, col): self.queen[row][col] = 1 self.Queen_setRow[row] = col self.dfs(row + 1) self.queen[row][col] = 0 def run(self, row=0): self.dfs(0) # self.solves.append([0,6,4,7,1,3,5,2]) # # ############################################################################## ################# 完成后请记得提交作业 ################# ############################################################################## def showResults(self, result): """ 结果展示. """ self.chessBoard.boardInit(False) for i, item in enumerate(result): if item >= 0: self.chessBoard.setQueen(i, item, False) self.chessBoard.printChessboard(False) def get_results(self): """ 输出结果(请勿修改此函数). return: 八皇后的序列解的list. """ self.run() return self.solves
class Game: def __init__(self, show=True): """ 初始化游戏状态. """ self.chessBoard = Chessboard(show) self.solves = [] self.gameInit() # 重置游戏 def gameInit(self, show=True): """ 重置棋盘. """ self.Queen_setRow = [-1] * 8 self.chessBoard.boardInit(False) ############################################################################## #### 输出:self.solves = 八皇后所有序列解的list #### #### 如:[[0,6,4,7,1,3,5,2],]代表八皇后的一个解为 #### #### (0,0),(1,6),(2,4),(3,7),(4,1),(5,3),(6,5),(7,2) #### ############################################################################## def collide(self, cur_queen, next_col): next_row = rows = len(cur_queen) for row in range(rows): column = cur_queen[row] if abs(column - next_col) in (0, next_row - row): return True return False def solve(self, num, cur_queen=[]): for pos in range(num): # 八皇后的数量N=0, 1, 2, 3, 4, 5, 6 , 7 你要在哪一列放置皇后 # 如果不冲突,则递归构造棋盘。 if not self.collide(cur_queen, pos): # 回溯法的体现 # 如果棋盘状态state已经等于num-1,即到达倒数第二行,而这时最后一行皇后又没冲突,直接yield,打出其位置(pos, ) if len(cur_queen) == num - 1: # cur_queen=() yield [ pos, ] else: for result in self.solve(num, cur_queen + [ pos, ]): yield [ pos, ] + result def run(self, row=0): solutions = self.solve(8) self.solves = [] for idx, solution in enumerate(solutions): self.solves.append(solution) def showResults(self, result): """ 结果展示. """ self.chessBoard.boardInit(False) for i, item in enumerate(result): if item >= 0: self.chessBoard.setQueen(i, item, False) self.chessBoard.printChessboard(False) def get_results(self): """ 输出结果(请勿修改此函数). return: 八皇后的序列解的list. """ self.run() return self.solves