Python递归实现八皇后问题

2023-04-15 00:00:00 python 递归 皇后

八皇后问题是指在8x8的国际象棋棋盘中放置8个皇后,要求任意两个皇后不得处于同一行、同一列或同一斜线上。
使用递归可以很方便地解决八皇后问题。具体思路如下:
1. 首先,我们需要一个函数来判断当前位置是否可以放置皇后。这个函数接受三个参数:当前行数、当前列数和已经放置的皇后的位置列表。
2. 在放置皇后之前,我们需要判断当前位置是否与已经放置的皇后位置冲突。如果冲突,则返回False,否则继续下一步。
3. 如果当前行数大于等于8,则表示已经成功地放置了8个皇后,因此返回True表示成功。
4. 在当前行数中,循环遍历每一列,尝试放置皇后。如果在某一列放置皇后成功,则将皇后位置(行数、列数)添加到已经放置的位置列表中,并递归调用函数,继续向下一行放置皇后。
5. 如果在某一列放置皇后失败,则继续尝试下一列,直到全部尝试完毕。如果全部尝试完毕,皇后仍未被成功放置,则返回False。
下面是Python代码演示:

def can_place(row, col, queens):
    """
    判断当前位置是否可以放置皇后
    """
    for r, c in queens:
        if r == row or c == col or abs(r - row) == abs(c - col):
            return False
    return True
def solve(row, queens):
    """
    递归函数,解决八皇后问题
    """
    if row >= 8:
        return True
    for col in range(8):
        if can_place(row, col, queens):
            queens.append((row, col))
            if solve(row + 1, queens):
                return True
            queens.pop()
    return False
queens = []
solve(0, queens)
for row, col in queens:
    print(f"皇后在第 {row+1} 行,第 {col+1} 列")

代码详解:
1. 在 can_place 函数中,我们遍历已经放置的皇后的位置列表,判断当前位置是否与已经放置的皇后位置冲突。如果冲突,则返回 False,否则返回 True。
2. 在 solve 函数中,我们首先判断当前行数是否大于等于 8。如果是,表示已经在前面的行成功地放置了 8 个皇后,因此返回 True 表示成功。
3. 在当前行数中,循环遍历每一列,尝试放置皇后。如果在某一列放置皇后成功,则将皇后位置(行数、列数)添加到已经放置的位置列表中,并递归调用函数,继续向下一行放置皇后。
4. 如果在某一列放置皇后失败,则继续尝试下一列,直到全部尝试完毕。如果全部尝试完毕,皇后仍未被成功放置,则返回 False。
5. 在主程序中,我们调用 solve 函数,并传入初始行数为 0 和空的已放置皇后位置列表。如果成功放置了 8 个皇后,则输出每个皇后的位置(行数、列数)。如果无法放置 8 个皇后,则程序不会有任何输出。
代码输出示例:

皇后在第 1 行,第 5 列
皇后在第 2 行,第 3 列
皇后在第 3 行,第 1 列
皇后在第 4 行,第 7 列
皇后在第 5 行,第 2 列
皇后在第 6 行,第 8 列
皇后在第 7 行,第 6 列
皇后在第 8 行,第 4 列

相关文章