python全排列解决八皇后问题

八皇后问题

八皇后问题是指8X8的国际象棋棋盘上,如何放置8个皇后,使得任意两个皇后不会互相攻击。算上对称解的话,八皇后问题有91个解(当然,我们习惯从0开始计数)。

用全排列求解八皇后问题

不难想到,用(0,1,2,3,4,5,6,7)八个数字组成个tuple,其中数字所在位置代表了行,数字本身代表了列,则任意一个排列即代表一种放置方法,使得任意两个皇后不会同行或同列,只需检查是否存在对角线冲突,若正反对角线都不冲突(任意两皇后之间坐标之和不相等,坐标之差不相等),此放置即为一个解。
利用python的itertools生成全排列进行迭代,解法非常容易理解,代码可以写的很简洁,不包括打印输出代码的话不到十行。

  1. 生成全排列,遍历之
  2. 如果不冲突即为解之一,输出

代码示例

from itertools import permutations


# 检查排列x是否存在冲突,无冲突返回True
def check(x):
    for i in range(len(x) - 1):
        for k in range(i + 1, len(x)):
            if i + x[i] == k + x[k] or i - x[i] == k - x[k]:
                return False
    return True


# 打印棋盘和排列x的皇后位置
def print_queen(x):
    n = len(x)
    for i in range(n):
        print((x[i]) * '□' + 'o' + (n - x[i] - 1) * '□')
    print()


solutions = 0
# 产生皇后位置的全排列,检查无冲突即为一个解
for x in permutations(range(8)):
    if check(x):
        print(solutions, x)
        print_queen(x)
        solutions += 1

输出样例

91 (7, 3, 0, 2, 5, 1, 6, 4)
□□□□□□□o
□□□o□□□□
o□□□□□□□
□□o□□□□□
□□□□□o□□
□o□□□□□□
□□□□□□o□
□□□□o□□□

猜你喜欢

转载自blog.csdn.net/lqgeqmbc/article/details/89787150