02698: 八皇后问题解输出
dfs and similar, http://cs101.openjudge.cn/practice/02698
在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方。
输入:无输入。
输出:按给定顺序和格式输出所有八皇后问题的解(见Sample Output)。
样例输入
样例输出
No. 1
1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1
0 1 0 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0
0 0 1 0 0 0 0 0
No. 2
1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 1
0 1 0 0 0 0 0 0
0 0 0 0 1 0 0 0
0 0 1 0 0 0 0 0
No. 3
1 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 1
0 0 1 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 1 0 0 0 0
0 1 0 0 0 0 0 0
0 0 0 0 1 0 0 0
...以下省略提示:此题可使用函数递归调用的方法求解。
来源:计算概论05
说明:1)02754.八皇后,描述的更详细一些。
2)2698.八皇后问题,只是给了样例,但这两个的顺序不太一样。需要参照样例判断输出。
思路:dfs实现的八皇后,答案转置输出.
python
def is_safe(board, row, col):
# 检查当前位置是否安全
# 检查同一列是否有皇后
for i in range(row):
if board[i][col] == 1:
return False
# 检查左上方是否有皇后
i = row - 1
j = col - 1
while i >= 0 and j >= 0:
if board[i][j] == 1:
return False
i -= 1
j -= 1
# 检查右上方是否有皇后
i = row - 1
j = col + 1
while i >= 0 and j < 8:
if board[i][j] == 1:
return False
i -= 1
j += 1
return True
def solve_n_queens(board, row, solutions):
# 递归回溯求解八皇后问题
if row == 8:
# 找到一个解,将解添加到结果列表
solutions.append([board[i].copy() for i in range(8)])
return
for col in range(8):
if is_safe(board, row, col):
# 当前位置安全,放置皇后
board[row][col] = 1
# 继续递归放置下一行的皇后
solve_n_queens(board, row + 1, solutions)
# 回溯,撤销当前位置的皇后
board[row][col] = 0
# 初始化棋盘
board = [[0] * 8 for _ in range(8)]
solutions = []
# 求解八皇后问题
solve_n_queens(board, 0, solutions)
# 输出结果
def transpose_matrix(matrix):
return [[matrix[j][i] for j in range(len(matrix))] for i in range(len(matrix[0]))]
for i, solution in enumerate(solutions):
print(f"No. {i+1}")
for row in transpose_matrix(solution):
print(' '.join(map(str, row)))python
ans = []
def queen(A, cur=0): #考虑放第cur行的皇后
if cur == len(A): #如果已经放了n个皇后,一组新的解产生了
#ans.append(''.join([str(x+1) for x in A]))
ans.append(A[:])
return
for col in range(len(A)): #将当前皇后逐一放置在不同的列,每列对应一组解
for row in range(cur): #逐一判定,与前面的皇后是否冲突
if A[row] == col or abs(col - A[row]) == cur - row:
break
else: #若都不冲突
A[cur] = col #放置新皇后,在cur行,col列
queen(A, cur+1) #对下一个皇后位置进行递归
queen([None]*8)
for m in range(92):
print("No.",m+1)
output = [[0 for i in range(8)] for j in range(8)]
for x in range(8):
output[ ans[m][x] ][x] = 1
for n in range(8):
print(" ".join(map(str, output[n])))