1、(1)请编程实现从 n-皇后问题的所有 92 种可行解中筛选出 12 种独立解,而其余的解都 可以由这些独立解利用对称性或旋转而得到。 (2)若 n-皇后问题要求在求得第一个可行解之后算法即终止,请编程实现。 提示:可以用 flag 标志是否已经求得第一个可行解。根据 flag 的值决定是否继续进行本层 调用,还是直接返回上层调用点。
时间: 2023-11-27 07:52:26 浏览: 24
1. 实现从 n-皇后问题的所有 92 种可行解中筛选出 12 种独立解
以下是 Python 代码实现:
```python
def is_valid(board, row, col):
for i in range(row):
if board[i] == col or abs(board[i] - col) == abs(i - row):
return False
return True
def solve_n_queens(n):
def backtrack(row=0, cols=set(), diagonals=set(), anti_diagonals=set()):
nonlocal count
if row == n:
count += 1
# 收集独立解
if len(visited) < 12:
visited.add(tuple(board))
return
for col in range(n):
diagonal = row - col
anti_diagonal = row + col
if col in cols or diagonal in diagonals or anti_diagonal in anti_diagonals:
continue
board.append(col)
cols.add(col)
diagonals.add(diagonal)
anti_diagonals.add(anti_diagonal)
backtrack(row + 1, cols, diagonals, anti_diagonals)
board.pop()
cols.remove(col)
diagonals.remove(diagonal)
anti_diagonals.remove(anti_diagonal)
count = 0
visited = set()
board = []
backtrack()
return visited
```
2. 实现在求得第一个可行解之后算法即终止
以下是 Python 代码实现:
```python
def solve_n_queens(n):
def backtrack(row=0, cols=set(), diagonals=set(), anti_diagonals=set()):
nonlocal count, flag
if row == n:
count += 1
if flag:
return True
return
for col in range(n):
diagonal = row - col
anti_diagonal = row + col
if col in cols or diagonal in diagonals or anti_diagonal in anti_diagonals:
continue
board.append(col)
cols.add(col)
diagonals.add(diagonal)
anti_diagonals.add(anti_diagonal)
if backtrack(row + 1, cols, diagonals, anti_diagonals):
return True
board.pop()
cols.remove(col)
diagonals.remove(diagonal)
anti_diagonals.remove(anti_diagonal)
return False
count = 0
flag = False
board = []
backtrack()
return count
```
在 `backtrack` 函数中加入 `flag` 标志,当第一个可行解被找到时,将 `flag` 设为 `True`,并在 `backtrack` 函数中返回 True,以终止算法。