题目 1 :基础练习 2n皇后问题
解题思路
深度优先算法(可以自己画一下深度优先的遍历树)
1、先放白皇后,按照白皇后,不能同行、同列、同对角线,进行放置。循环列,递归行。
2、递归终止条件是行和输入的n相等
3、白皇后放置完成后,放置黑皇后,放置方法与白皇后一致,递归终止条件仍然是行和输入的n相等
代码
# 判断 白皇后 是否可以放置
def correctWhite(tmpWhite, row):
if arr[row][tmpWhite[row]] == 1: # 看棋盘中该位置是否可以放置
for i in range(row): # 判断条件为不在同一列,和不在同一对角线上
if tmpWhite[i] == tmpWhite[row] or abs(tmpWhite[i] - tmpWhite[row]) == abs(i - row):
return False
return True
else:
return False
# 判断 黑皇后 是否可以放置
def correctBlack(tmpBlack, row, tmpWhite):
if arr[row][tmpBlack[row]] == 1 and tmpBlack[row] != tmpWhite[row]: # 看棋盘中该位置是否可以放置
for i in range(row): # 判断条件为不在同一列,和不在同一对角线上
if tmpBlack[i] == tmpBlack[row] or abs(tmpBlack[i] - tmpBlack[row]) == abs(i - row):
return False
return True
else:
return False
# 放置黑皇后
def dfs_Black(tmpBlack, row):
if row == n:
# 黑皇后放置结束,ans+=1
ans.append(tmpBlack)
return # 退出递归
else:
for col in range(n): # 行确定,遍历列,寻找可以放置的位置
tmpBlack[row] = col
if correctBlack(tmpBlack, row, tmpWhite): # 看是否可以放置
dfs_Black(tmpBlack, row + 1) # 放下一个白皇后
# 放置白皇后
def dfs_White(tmpWhite, row):
if row == n:
# 白皇后放置结束,放置黑皇后
dfs_Black(tmpBlack, 0)
else:
for col in range(n): # 行确定,遍历列,寻找可以放置的位置
tmpWhite[row] = col
if correctWhite(tmpWhite, row): # 看是否可以放置
dfs_White(tmpWhite, row+1) # 放下一个白皇后
n = int(input())
# 创建棋盘
arr = [list(map(int, input().split())) for _ in range(n)]
# 临时存放白皇后棋盘
tmpWhite = [None for _ in range(n)]
# 临时存放黑皇后棋盘
tmpBlack = [None for _ in range(n)]
ans = []
# 先从白皇后开始放置
dfs_White(tmpWhite, 0)
print(len(ans))