问题
    image.png

    思路
    点击查看【bilibili】

    N皇后代码

    1. def dfs(chessboard, nums, row, n):
    2. if row == n:
    3. ans.append(nums[:])
    4. return
    5. for col in range(n): # 对于某行的各个列
    6. if chessboard[row][col] != 0:
    7. nums[row] = col # 第row行皇后所在的列数
    8. if valid(nums, row):
    9. dfs(chessboard, nums, row+1, n)
    10. def valid(nums, row):
    11. for i in range(row): # 第row行前面的行
    12. # 不在同一列
    13. # 不在对角线上(2, 2)...
    14. if nums[i] == nums[row] or abs(nums[i]-nums[row]) == abs(row-i):
    15. return False
    16. return True
    17. n = int(input())
    18. chessboard = [[int(i) for i in input().split()] for _ in range(n)]
    19. # print(chessboard)
    20. ans = []
    21. nums = [None for _ in range(n)]
    22. dfs(chessboard, nums, 0, n) # 当前第0行,一共n行
    23. print(len(ans))
    24. print(ans)

    2N皇后,简而言之就是有两个皇后,黑皇后和白皇后。

    1. def dfs(chessboard, nums, row, n):
    2. if row == n:
    3. ans.append(nums[:])
    4. return
    5. for col_white in range(n): # 对于某行的各个列
    6. if chessboard[row][col_white] != 0:
    7. nums[0][row] = col_white # 第row行皇后所在的列数
    8. for col_black in range(n):
    9. if chessboard[row][col_black] == 0 or col_white == col_black:
    10. continue
    11. nums[1][row] = col_black
    12. if valid(nums, row):
    13. dfs(chessboard, nums, row+1, n)
    14. def valid(nums, row):
    15. for color in range(2):
    16. tmp = nums[color]
    17. for i in range(row): # 第row行前面的行
    18. # 不在同一列
    19. # 不在对角线上(2, 2)...
    20. if tmp[i] == tmp[row] or abs(tmp[i]-tmp[row]) == abs(row-i):
    21. return False
    22. return True
    23. n = int(input())
    24. chessboard = [[int(i) for i in input().split()] for _ in range(n)]
    25. # print(chessboard)
    26. ans = []
    27. nums = [[None]*n for _ in range(2)] # nums[0]代表白皇后列索引;num[1]代表黑皇后列索引
    28. dfs(chessboard, nums, 0, n) # 当前第0行,一共n行
    29. print(len(ans))
    30. print(ans)

    ans打印有问题!!