2020-12-22

八皇后问题——经典再现

在8×8的方格中,放置8个皇后,使其相互不冲突,即任意一个皇后所在的行、列和斜线均无其它皇后。
以下是其中两种放置方法。

 0   0   0   0   1   0   0   0
 0   0   0   0   0   0   0   2
 0   0   0   3   0   0   0   0
 4   0   0   0   0   0   0   0
 0   0   0   0   0   0   5   0
 0   6   0   0   0   0   0   0
 0   0   0   0   0   7   0   0
 0   0   8   0   0   0   0   0

 1   0   0   0   0   0   0   0
 0   0   0   0   2   0   0   0
 0   0   0   0   0   0   0   3
 0   0   0   0   0   4   0   0
 0   0   5   0   0   0   0   0
 0   0   0   0   0   0   6   0
 0   7   0   0   0   0   0   0
 0   0   0   8   0   0   0   0

计算总共有多少种放置方法,并打印,皇后的编号从1-8。
这是经典的递归问题。与前文蛇形排列极为相似。不多解释。

def dfs(section):
    global n
    if section == 8:  # 递归返回条件,即一种放置方法成功后返回寻找另外一种放置方法,直至找到所有放置方法
        n += 1
        show()
        return
    # 试尝在section行放置皇后
    for k in range(8):  # k是列
        sign = 0
        for p in range(8):
            if mark[p][k] > 0:   # 如果k列已经放置了皇后,往后寻找其它合适位置
                sign = 1
                break
            for q in range(8):
                if mark[p][q] > 0 and abs(p - section) == abs(q - k):  # 如果斜线遭遇其他皇后,往后寻找其它合适位置
                    sign = 1
                    break
            if sign == 1:
                break
        if sign == 0:
            mark[section][k] = section + 1  # 设置皇后编号
            dfs(section + 1)  # 进入下一行递归搜索
            mark[section][k] = 0  # 返回时清除编号


def show():
    for _j in range(8):
        for _i in range(8):
            print("{0:2}".format(mark[_j][_i]), end="  ")
        print("")
    print("")


if __name__ == '__main__':
    n = 0
    mark = [[0 for _ in range(8)] for _ in range(8)]
    for i in range(8):
        mark[0][i] = 1  # 从第一行第一列(下标0,0)开始放置,首标记设置为1
        dfs(1)  # 开始递归搜索
        mark[0][i] = 0  # 重新搜索前先清除标记
    print("共有{0}种放置方法。".format(n))
D:\Python\Python38\python.exe D:/Python/study/eight.py
 1   0   0   0   0   0   0   0  
 0   0   0   0   2   0   0   0  
 0   0   0   0   0   0   0   3  
 0   0   0   0   0   4   0   0  
 0   0   5   0   0   0   0   0  
 0   0   0   0   0   0   6   0  
 0   7   0   0   0   0   0   0  
 0   0   0   8   0   0   0   0  

 1   0   0   0   0   0   0   0  
 0   0   0   0   0   2   0   0  
 0   0   0   0   0   0   0   3  
 0   0   4   0   0   0   0   0  
 0   0   0   0   0   0   5   0  
 0   0   0   6   0   0   0   0  
 0   7   0   0   0   0   0   0  
 0   0   0   0   8   0   0   0  

 1   0   0   0   0   0   0   0  
 0   0   0   0   0   0   2   0  
 0   0   0   3   0   0   0   0  
 0   0   0   0   0   4   0   0  
 0   0   0   0   0   0   0   5  
 0   6   0   0   0   0   0   0  
 0   0   0   0   7   0   0   0  
 0   0   8   0   0   0   0   0  

 1   0   0   0   0   0   0   0  
 0   0   0   0   0   0   2   0  
 0   0   0   0   3   0   0   0  
 0   0   0   0   0   0   0   4  
 0   5   0   0   0   0   0   0  
 0   0   0   6   0   0   0   0  
 0   0   0   0   0   7   0   0  
 0   0   8   0   0   0   0   0  

 0   1   0   0   0   0   0   0  
 0   0   0   2   0   0   0   0  
 0   0   0   0   0   3   0   0  
 0   0   0   0   0   0   0   4  
 0   0   5   0   0   0   0   0  
 6   0   0   0   0   0   0   0  
 0   0   0   0   0   0   7   0  
 0   0   0   0   8   0   0   0  

 0   1   0   0   0   0   0   0  
 0   0   0   0   2   0   0   0  
 0   0   0   0   0   0   3   0  
 4   0   0   0   0   0   0   0  
 0   0   5   0   0   0   0   0  
 0   0   0   0   0   0   0   6  
 0   0   0   0   0   7   0   0  
 0   0   0   8   0   0   0   0  

 0   1   0   0   0   0   0   0  
 0   0   0   0   2   0   0   0  
 0   0   0   0   0   0   3   0  
 0   0   0   4   0   0   0   0  
 5   0   0   0   0   0   0   0  
 0   0   0   0   0   0   0   6  
 0   0   0   0   0   7   0   0  
 0   0   8   0   0   0   0   0  

 0   1   0   0   0   0   0   0  
 0   0   0   0   0   2   0   0  
 3   0   0   0   0   0   0   0  
 0   0   0   0   0   0   4   0  
 0   0   0   5   0   0   0   0  
 0   0   0   0   0   0   0   6  
 0   0   7   0   0   0   0   0  
 0   0   0   0   8   0   0   0  

 0   1   0   0   0   0   0   0  
 0   0   0   0   0   2   0   0  
 0   0   0   0   0   0   0   3  
 0   0   4   0   0   0   0   0  
 5   0   0   0   0   0   0   0  
 0   0   0   6   0   0   0   0  
 0   0   0   0   0   0   7   0  
 0   0   0   0   8   0   0   0  

 0   1   0   0   0   0   0   0  
 0   0   0   0   0   0   2   0  
 0   0   3   0   0   0   0   0  
 0   0   0   0   0   4   0   0  
 0   0   0   0   0   0   0   5  
 0   0   0   0   6   0   0   0  
 7   0   0   0   0   0   0   0  
 0   0   0   8   0   0   0   0  

 0   1   0   0   0   0   0   0  
 0   0   0   0   0   0   2   0  
 0   0   0   0   3   0   0   0  
 0   0   0   0   0   0   0   4  
 5   0   0   0   0   0   0   0  
 0   0   0   6   0   0   0   0  
 0   0   0   0   0   7   0   0  
 0   0   8   0   0   0   0   0  

 0   1   0   0   0   0   0   0  
 0   0   0   0   0   0   0   2  
 0   0   0   0   0   3   0   0  
 4   0   0   0   0   0   0   0  
 0   0   5   0   0   0   0   0  
 0   0   0   0   6   0   0   0  
 0   0   0   0   0   0   7   0  
 0   0   0   8   0   0   0   0  

 0   0   1   0   0   0   0   0  
 2   0   0   0   0   0   0   0  
 0   0   0   0   0   0   3   0  
 0   0   0   0   4   0   0   0  
 0   0   0   0   0   0   0   5  
 0   6   0   0   0   0   0   0  
 0   0   0   7   0   0   0   0  
 0   0   0   0   0   8   0   0  

 0   0   1   0   0   0   0   0  
 0   0   0   0   2   0   0   0  
 0   3   0   0   0   0   0   0  
 0   0   0   0   0   0   0   4  
 5   0   0   0   0   0   0   0  
 0   0   0   0   0   0   6   0  
 0   0   0   7   0   0   0   0  
 0   0   0   0   0   8   0   0  

 0   0   1   0   0   0   0   0  
 0   0   0   0   2   0   0   0  
 0   3   0   0   0   0   0   0  
 0   0   0   0   0   0   0   4  
 0   0   0   0   0   5   0   0  
 0   0   0   6   0   0   0   0  
 0   0   0   0   0   0   7   0  
 8   0   0   0   0   0   0   0  

 0   0   1   0   0   0   0   0  
 0   0   0   0   2   0   0   0  
 0   0   0   0   0   0   3   0  
 4   0   0   0   0   0   0   0  
 0   0   0   5   0   0   0   0  
 0   6   0   0   0   0   0   0  
 0   0   0   0   0   0   0   7  
 0   0   0   0   0   8   0   0  

 0   0   1   0   0   0   0   0  
 0   0   0   0   2   0   0   0  
 0   0   0   0   0   0   0   3  
 0   0   0   4   0   0   0   0  
 5   0   0   0   0   0   0   0  
 0   0   0   0   0   0   6   0  
 0   7   0   0   0   0   0   0  
 0   0   0   0   0   8   0   0  

 0   0   1   0   0   0   0   0  
 0   0   0   0   0   2   0   0  
 0   3   0   0   0   0   0   0  
 0   0   0   0   4   0   0   0  
 0   0   0   0   0   0   0   5  
 6   0   0   0   0   0   0   0  
 0   0   0   0   0   0   7   0  
 0   0   0   8   0   0   0   0  

 0   0   1   0   0   0   0   0  
 0   0   0   0   0   2   0   0  
 0   3   0   0   0   0   0   0  
 0   0   0   0   0   0   4   0  
 5   0   0   0   0   0   0   0  
 0   0   0   6   0   0   0   0  
 0   0   0   0   0   0   0   7  
 0   0   0   0   8   0   0   0  

 0   0   1   0   0   0   0   0  
 0   0   0   0   0   2   0   0  
 0   3   0   0   0   0   0   0  
 0   0   0   0   0   0   4   0  
 0   0   0   0   5   0   0   0  
 6   0   0   0   0   0   0   0  
 0   0   0   0   0   0   0   7  
 0   0   0   8   0   0   0   0  

 0   0   1   0   0   0   0   0  
 0   0   0   0   0   2   0   0  
 0   0   0   3   0   0   0   0  
 4   0   0   0   0   0   0   0  
 0   0   0   0   0   0   0   5  
 0   0   0   0   6   0   0   0  
 0   0   0   0   0   0   7   0  
 0   8   0   0   0   0   0   0  

 0   0   1   0   0   0   0   0  
 0   0   0   0   0   2   0   0  
 0   0   0   3   0   0   0   0  
 0   4   0   0   0   0   0   0  
 0   0   0   0   0   0   0   5  
 0   0   0   0   6   0   0   0  
 0   0   0   0   0   0   7   0  
 8   0   0   0   0   0   0   0  

 0   0   1   0   0   0   0   0  
 0   0   0   0   0   2   0   0  
 0   0   0   0   0   0   0   3  
 4   0   0   0   0   0   0   0  
 0   0   0   5   0   0   0   0  
 0   0   0   0   0   0   6   0  
 0   0   0   0   7   0   0   0  
 0   8   0   0   0   0   0   0  

 0   0   1   0   0   0   0   0  
 0   0   0   0   0   2   0   0  
 0   0   0   0   0   0   0   3  
 4   0   0   0   0   0   0   0  
 0   0   0   0   5   0   0   0  
 0   0   0   0   0   0   6   0  
 0   7   0   0   0   0   0   0  
 0   0   0   8   0   0   0   0  

 0   0   1   0   0   0   0   0  
 0   0   0   0   0   2   0   0  
 0   0   0   0   0   0   0   3  
 0   4   0   0   0   0   0   0  
 0   0   0   5   0   0   0   0  
 6   0   0   0   0   0   0   0  
 0   0   0   0   0   0   7   0  
 0   0   0   0   8   0   0   0  

 0   0   1   0   0   0   0   0  
 0   0   0   0   0   0   2   0  
 0   3   0   0   0   0   0   0  
 0   0   0   0   0   0   0   4  
 0   0   0   0   5   0   0   0  
 6   0   0   0   0   0   0   0  
 0   0   0   7   0   0   0   0  
 0   0   0   0   0   8   0   0  

 0   0   1   0   0   0   0   0  
 0   0   0   0   0   0   2   0  
 0   3   0   0   0   0   0   0  
 0   0   0   0   0   0   0   4  
 0   0   0   0   0   5   0   0  
 0   0   0   6   0   0   0   0  
 7   0   0   0   0   0   0   0  
 0   0   0   0   8   0   0   0  

 0   0   1   0   0   0   0   0  
 0   0   0   0   0   0   0   2  
 0   0   0   3   0   0   0   0  
 0   0   0   0   0   0   4   0  
 5   0   0   0   0   0   0   0  
 0   0   0   0   0   6   0   0  
 0   7   0   0   0   0   0   0  
 0   0   0   0   8   0   0   0  

 0   0   0   1   0   0   0   0  
 2   0   0   0   0   0   0   0  
 0   0   0   0   3   0   0   0  
 0   0   0   0   0   0   0   4  
 0   5   0   0   0   0   0   0  
 0   0   0   0   0   0   6   0  
 0   0   7   0   0   0   0   0  
 0   0   0   0   0   8   0   0  

 0   0   0   1   0   0   0   0  
 2   0   0   0   0   0   0   0  
 0   0   0   0   3   0   0   0  
 0   0   0   0   0   0   0   4  
 0   0   0   0   0   5   0   0  
 0   0   6   0   0   0   0   0  
 0   0   0   0   0   0   7   0  
 0   8   0   0   0   0   0   0  

 0   0   0   1   0   0   0   0  
 0   2   0   0   0   0   0   0  
 0   0   0   0   3   0   0   0  
 0   0   0   0   0   0   0   4  
 0   0   0   0   0   5   0   0  
 6   0   0   0   0   0   0   0  
 0   0   7   0   0   0   0   0  
 0   0   0   0   0   0   8   0  

 0   0   0   1   0   0   0   0  
 0   2   0   0   0   0   0   0  
 0   0   0   0   0   0   3   0  
 0   0   4   0   0   0   0   0  
 0   0   0   0   0   5   0   0  
 0   0   0   0   0   0   0   6  
 7   0   0   0   0   0   0   0  
 0   0   0   0   8   0   0   0  

 0   0   0   1   0   0   0   0  
 0   2   0   0   0   0   0   0  
 0   0   0   0   0   0   3   0  
 0   0   4   0   0   0   0   0  
 0   0   0   0   0   5   0   0  
 0   0   0   0   0   0   0   6  
 0   0   0   0   7   0   0   0  
 8   0   0   0   0   0   0   0  

 0   0   0   1   0   0   0   0  
 0   2   0   0   0   0   0   0  
 0   0   0   0   0   0   3   0  
 0   0   0   0   4   0   0   0  
 5   0   0   0   0   0   0   0  
 0   0   0   0   0   0   0   6  
 0   0   0   0   0   7   0   0  
 0   0   8   0   0   0   0   0  

 0   0   0   1   0   0   0   0  
 0   2   0   0   0   0   0   0  
 0   0   0   0   0   0   0   3  
 0   0   0   0   4   0   0   0  
 0   0   0   0   0   0   5   0  
 6   0   0   0   0   0   0   0  
 0   0   7   0   0   0   0   0  
 0   0   0   0   0   8   0   0  

 0   0   0   1   0   0   0   0  
 0   2   0   0   0   0   0   0  
 0   0   0   0   0   0   0   3  
 0   0   0   0   0   4   0   0  
 5   0   0   0   0   0   0   0  
 0   0   6   0   0   0   0   0  
 0   0   0   0   7   0   0   0  
 0   0   0   0   0   0   8   0  

 0   0   0   1   0   0   0   0  
 0   0   0   0   0   2   0   0  
 3   0   0   0   0   0   0   0  
 0   0   0   0   4   0   0   0  
 0   5   0   0   0   0   0   0  
 0   0   0   0   0   0   0   6  
 0   0   7   0   0   0   0   0  
 0   0   0   0   0   0   8   0  

 0   0   0   1   0   0   0   0  
 0   0   0   0   0   2   0   0  
 0   0   0   0   0   0   0   3  
 0   4   0   0   0   0   0   0  
 0   0   0   0   0   0   5   0  
 6   0   0   0   0   0   0   0  
 0   0   7   0   0   0   0   0  
 0   0   0   0   8   0   0   0  

 0   0   0   1   0   0   0   0  
 0   0   0   0   0   2   0   0  
 0   0   0   0   0   0   0   3  
 0   0   4   0   0   0   0   0  
 5   0   0   0   0   0   0   0  
 0   0   0   0   0   0   6   0  
 0   0   0   0   7   0   0   0  
 0   8   0   0   0   0   0   0  

 0   0   0   1   0   0   0   0  
 0   0   0   0   0   0   2   0  
 3   0   0   0   0   0   0   0  
 0   0   0   0   0   0   0   4  
 0   0   0   0   5   0   0   0  
 0   6   0   0   0   0   0   0  
 0   0   0   0   0   7   0   0  
 0   0   8   0   0   0   0   0  

 0   0   0   1   0   0   0   0  
 0   0   0   0   0   0   2   0  
 0   0   3   0   0   0   0   0  
 0   0   0   0   0   0   0   4  
 0   5   0   0   0   0   0   0  
 0   0   0   0   6   0   0   0  
 7   0   0   0   0   0   0   0  
 0   0   0   0   0   8   0   0  

 0   0   0   1   0   0   0   0  
 0   0   0   0   0   0   2   0  
 0   0   0   0   3   0   0   0  
 0   4   0   0   0   0   0   0  
 0   0   0   0   0   5   0   0  
 6   0   0   0   0   0   0   0  
 0   0   7   0   0   0   0   0  
 0   0   0   0   0   0   0   8  

 0   0   0   1   0   0   0   0  
 0   0   0   0   0   0   2   0  
 0   0   0   0   3   0   0   0  
 0   0   4   0   0   0   0   0  
 5   0   0   0   0   0   0   0  
 0   0   0   0   0   6   0   0  
 0   0   0   0   0   0   0   7  
 0   8   0   0   0   0   0   0  

 0   0   0   1   0   0   0   0  
 0   0   0   0   0   0   0   2  
 3   0   0   0   0   0   0   0  
 0   0   4   0   0   0   0   0  
 0   0   0   0   0   5   0   0  
 0   6   0   0   0   0   0   0  
 0   0   0   0   0   0   7   0  
 0   0   0   0   8   0   0   0  

 0   0   0   1   0   0   0   0  
 0   0   0   0   0   0   0   2  
 3   0   0   0   0   0   0   0  
 0   0   0   0   4   0   0   0  
 0   0   0   0   0   0   5   0  
 0   6   0   0   0   0   0   0  
 0   0   0   0   0   7   0   0  
 0   0   8   0   0   0   0   0  

 0   0   0   1   0   0   0   0  
 0   0   0   0   0   0   0   2  
 0   0   0   0   3   0   0   0  
 0   0   4   0   0   0   0   0  
 5   0   0   0   0   0   0   0  
 0   0   0   0   0   0   6   0  
 0   7   0   0   0   0   0   0  
 0   0   0   0   0   8   0   0  

 0   0   0   0   1   0   0   0  
 2   0   0   0   0   0   0   0  
 0   0   0   3   0   0   0   0  
 0   0   0   0   0   4   0   0  
 0   0   0   0   0   0   0   5  
 0   6   0   0   0   0   0   0  
 0   0   0   0   0   0   7   0  
 0   0   8   0   0   0   0   0  

 0   0   0   0   1   0   0   0  
 2   0   0   0   0   0   0   0  
 0   0   0   0   0   0   0   3  
 0   0   0   4   0   0   0   0  
 0   5   0   0   0   0   0   0  
 0   0   0   0   0   0   6   0  
 0   0   7   0   0   0   0   0  
 0   0   0   0   0   8   0   0  

 0   0   0   0   1   0   0   0  
 2   0   0   0   0   0   0   0  
 0   0   0   0   0   0   0   3  
 0   0   0   0   0   4   0   0  
 0   0   5   0   0   0   0   0  
 0   0   0   0   0   0   6   0  
 0   7   0   0   0   0   0   0  
 0   0   0   8   0   0   0   0  

 0   0   0   0   1   0   0   0  
 0   2   0   0   0   0   0   0  
 0   0   0   3   0   0   0   0  
 0   0   0   0   0   4   0   0  
 0   0   0   0   0   0   0   5  
 0   0   6   0   0   0   0   0  
 7   0   0   0   0   0   0   0  
 0   0   0   0   0   0   8   0  

 0   0   0   0   1   0   0   0  
 0   2   0   0   0   0   0   0  
 0   0   0   3   0   0   0   0  
 0   0   0   0   0   0   4   0  
 0   0   5   0   0   0   0   0  
 0   0   0   0   0   0   0   6  
 0   0   0   0   0   7   0   0  
 8   0   0   0   0   0   0   0  

 0   0   0   0   1   0   0   0  
 0   2   0   0   0   0   0   0  
 0   0   0   0   0   3   0   0  
 4   0   0   0   0   0   0   0  
 0   0   0   0   0   0   5   0  
 0   0   0   6   0   0   0   0  
 0   0   0   0   0   0   0   7  
 0   0   8   0   0   0   0   0  

 0   0   0   0   1   0   0   0  
 0   2   0   0   0   0   0   0  
 0   0   0   0   0   0   0   3  
 4   0   0   0   0   0   0   0  
 0   0   0   5   0   0   0   0  
 0   0   0   0   0   0   6   0  
 0   0   7   0   0   0   0   0  
 0   0   0   0   0   8   0   0  

 0   0   0   0   1   0   0   0  
 0   0   2   0   0   0   0   0  
 3   0   0   0   0   0   0   0  
 0   0   0   0   0   4   0   0  
 0   0   0   0   0   0   0   5  
 0   6   0   0   0   0   0   0  
 0   0   0   7   0   0   0   0  
 0   0   0   0   0   0   8   0  

 0   0   0   0   1   0   0   0  
 0   0   2   0   0   0   0   0  
 3   0   0   0   0   0   0   0  
 0   0   0   0   0   0   4   0  
 0   5   0   0   0   0   0   0  
 0   0   0   0   0   0   0   6  
 0   0   0   0   0   7   0   0  
 0   0   0   8   0   0   0   0  

 0   0   0   0   1   0   0   0  
 0   0   2   0   0   0   0   0  
 0   0   0   0   0   0   0   3  
 0   0   0   4   0   0   0   0  
 0   0   0   0   0   0   5   0  
 6   0   0   0   0   0   0   0  
 0   0   0   0   0   7   0   0  
 0   8   0   0   0   0   0   0  

 0   0   0   0   1   0   0   0  
 0   0   0   0   0   0   2   0  
 3   0   0   0   0   0   0   0  
 0   0   4   0   0   0   0   0  
 0   0   0   0   0   0   0   5  
 0   0   0   0   0   6   0   0  
 0   0   0   7   0   0   0   0  
 0   8   0   0   0   0   0   0  

 0   0   0   0   1   0   0   0  
 0   0   0   0   0   0   2   0  
 3   0   0   0   0   0   0   0  
 0   0   0   4   0   0   0   0  
 0   5   0   0   0   0   0   0  
 0   0   0   0   0   0   0   6  
 0   0   0   0   0   7   0   0  
 0   0   8   0   0   0   0   0  

 0   0   0   0   1   0   0   0  
 0   0   0   0   0   0   2   0  
 0   3   0   0   0   0   0   0  
 0   0   0   4   0   0   0   0  
 0   0   0   0   0   0   0   5  
 6   0   0   0   0   0   0   0  
 0   0   7   0   0   0   0   0  
 0   0   0   0   0   8   0   0  

 0   0   0   0   1   0   0   0  
 0   0   0   0   0   0   2   0  
 0   3   0   0   0   0   0   0  
 0   0   0   0   0   4   0   0  
 0   0   5   0   0   0   0   0  
 6   0   0   0   0   0   0   0  
 0   0   0   7   0   0   0   0  
 0   0   0   0   0   0   0   8  

 0   0   0   0   1   0   0   0  
 0   0   0   0   0   0   2   0  
 0   3   0   0   0   0   0   0  
 0   0   0   0   0   4   0   0  
 0   0   5   0   0   0   0   0  
 6   0   0   0   0   0   0   0  
 0   0   0   0   0   0   0   7  
 0   0   0   8   0   0   0   0  

 0   0   0   0   1   0   0   0  
 0   0   0   0   0   0   2   0  
 0   0   0   3   0   0   0   0  
 4   0   0   0   0   0   0   0  
 0   0   5   0   0   0   0   0  
 0   0   0   0   0   0   0   6  
 0   0   0   0   0   7   0   0  
 0   8   0   0   0   0   0   0  

 0   0   0   0   1   0   0   0  
 0   0   0   0   0   0   0   2  
 0   0   0   3   0   0   0   0  
 4   0   0   0   0   0   0   0  
 0   0   5   0   0   0   0   0  
 0   0   0   0   0   6   0   0  
 0   7   0   0   0   0   0   0  
 0   0   0   0   0   0   8   0  

 0   0   0   0   1   0   0   0  
 0   0   0   0   0   0   0   2  
 0   0   0   3   0   0   0   0  
 4   0   0   0   0   0   0   0  
 0   0   0   0   0   0   5   0  
 0   6   0   0   0   0   0   0  
 0   0   0   0   0   7   0   0  
 0   0   8   0   0   0   0   0  

 0   0   0   0   0   1   0   0  
 2   0   0   0   0   0   0   0  
 0   0   0   0   3   0   0   0  
 0   4   0   0   0   0   0   0  
 0   0   0   0   0   0   0   5  
 0   0   6   0   0   0   0   0  
 0   0   0   0   0   0   7   0  
 0   0   0   8   0   0   0   0  

 0   0   0   0   0   1   0   0  
 0   2   0   0   0   0   0   0  
 0   0   0   0   0   0   3   0  
 4   0   0   0   0   0   0   0  
 0   0   5   0   0   0   0   0  
 0   0   0   0   6   0   0   0  
 0   0   0   0   0   0   0   7  
 0   0   0   8   0   0   0   0  

 0   0   0   0   0   1   0   0  
 0   2   0   0   0   0   0   0  
 0   0   0   0   0   0   3   0  
 4   0   0   0   0   0   0   0  
 0   0   0   5   0   0   0   0  
 0   0   0   0   0   0   0   6  
 0   0   0   0   7   0   0   0  
 0   0   8   0   0   0   0   0  

 0   0   0   0   0   1   0   0  
 0   0   2   0   0   0   0   0  
 3   0   0   0   0   0   0   0  
 0   0   0   0   0   0   4   0  
 0   0   0   0   5   0   0   0  
 0   0   0   0   0   0   0   6  
 0   7   0   0   0   0   0   0  
 0   0   0   8   0   0   0   0  

 0   0   0   0   0   1   0   0  
 0   0   2   0   0   0   0   0  
 3   0   0   0   0   0   0   0  
 0   0   0   0   0   0   0   4  
 0   0   0   5   0   0   0   0  
 0   6   0   0   0   0   0   0  
 0   0   0   0   0   0   7   0  
 0   0   0   0   8   0   0   0  

 0   0   0   0   0   1   0   0  
 0   0   2   0   0   0   0   0  
 3   0   0   0   0   0   0   0  
 0   0   0   0   0   0   0   4  
 0   0   0   0   5   0   0   0  
 0   6   0   0   0   0   0   0  
 0   0   0   7   0   0   0   0  
 0   0   0   0   0   0   8   0  

 0   0   0   0   0   1   0   0  
 0   0   2   0   0   0   0   0  
 0   0   0   0   3   0   0   0  
 0   0   0   0   0   0   4   0  
 5   0   0   0   0   0   0   0  
 0   0   0   6   0   0   0   0  
 0   7   0   0   0   0   0   0  
 0   0   0   0   0   0   0   8  

 0   0   0   0   0   1   0   0  
 0   0   2   0   0   0   0   0  
 0   0   0   0   3   0   0   0  
 0   0   0   0   0   0   0   4  
 5   0   0   0   0   0   0   0  
 0   0   0   6   0   0   0   0  
 0   7   0   0   0   0   0   0  
 0   0   0   0   0   0   8   0  

 0   0   0   0   0   1   0   0  
 0   0   2   0   0   0   0   0  
 0   0   0   0   0   0   3   0  
 0   4   0   0   0   0   0   0  
 0   0   0   5   0   0   0   0  
 0   0   0   0   0   0   0   6  
 7   0   0   0   0   0   0   0  
 0   0   0   0   8   0   0   0  

 0   0   0   0   0   1   0   0  
 0   0   2   0   0   0   0   0  
 0   0   0   0   0   0   3   0  
 0   4   0   0   0   0   0   0  
 0   0   0   0   0   0   0   5  
 0   0   0   0   6   0   0   0  
 7   0   0   0   0   0   0   0  
 0   0   0   8   0   0   0   0  

 0   0   0   0   0   1   0   0  
 0   0   2   0   0   0   0   0  
 0   0   0   0   0   0   3   0  
 0   0   0   4   0   0   0   0  
 5   0   0   0   0   0   0   0  
 0   0   0   0   0   0   0   6  
 0   7   0   0   0   0   0   0  
 0   0   0   0   8   0   0   0  

 0   0   0   0   0   1   0   0  
 0   0   0   2   0   0   0   0  
 3   0   0   0   0   0   0   0  
 0   0   0   0   4   0   0   0  
 0   0   0   0   0   0   0   5  
 0   6   0   0   0   0   0   0  
 0   0   0   0   0   0   7   0  
 0   0   8   0   0   0   0   0  

 0   0   0   0   0   1   0   0  
 0   0   0   2   0   0   0   0  
 0   3   0   0   0   0   0   0  
 0   0   0   0   0   0   0   4  
 0   0   0   0   5   0   0   0  
 0   0   0   0   0   0   6   0  
 7   0   0   0   0   0   0   0  
 0   0   8   0   0   0   0   0  

 0   0   0   0   0   1   0   0  
 0   0   0   2   0   0   0   0  
 0   0   0   0   0   0   3   0  
 4   0   0   0   0   0   0   0  
 0   0   5   0   0   0   0   0  
 0   0   0   0   6   0   0   0  
 0   7   0   0   0   0   0   0  
 0   0   0   0   0   0   0   8  

 0   0   0   0   0   1   0   0  
 0   0   0   2   0   0   0   0  
 0   0   0   0   0   0   3   0  
 4   0   0   0   0   0   0   0  
 0   0   0   0   0   0   0   5  
 0   6   0   0   0   0   0   0  
 0   0   0   0   7   0   0   0  
 0   0   8   0   0   0   0   0  

 0   0   0   0   0   1   0   0  
 0   0   0   0   0   0   0   2  
 0   3   0   0   0   0   0   0  
 0   0   0   4   0   0   0   0  
 5   0   0   0   0   0   0   0  
 0   0   0   0   0   0   6   0  
 0   0   0   0   7   0   0   0  
 0   0   8   0   0   0   0   0  

 0   0   0   0   0   0   1   0  
 2   0   0   0   0   0   0   0  
 0   0   3   0   0   0   0   0  
 0   0   0   0   0   0   0   4  
 0   0   0   0   0   5   0   0  
 0   0   0   6   0   0   0   0  
 0   7   0   0   0   0   0   0  
 0   0   0   0   8   0   0   0  

 0   0   0   0   0   0   1   0  
 0   2   0   0   0   0   0   0  
 0   0   0   3   0   0   0   0  
 4   0   0   0   0   0   0   0  
 0   0   0   0   0   0   0   5  
 0   0   0   0   6   0   0   0  
 0   0   7   0   0   0   0   0  
 0   0   0   0   0   8   0   0  

 0   0   0   0   0   0   1   0  
 0   2   0   0   0   0   0   0  
 0   0   0   0   0   3   0   0  
 0   0   4   0   0   0   0   0  
 5   0   0   0   0   0   0   0  
 0   0   0   6   0   0   0   0  
 0   0   0   0   0   0   0   7  
 0   0   0   0   8   0   0   0  

 0   0   0   0   0   0   1   0  
 0   0   2   0   0   0   0   0  
 3   0   0   0   0   0   0   0  
 0   0   0   0   0   4   0   0  
 0   0   0   0   0   0   0   5  
 0   0   0   0   6   0   0   0  
 0   7   0   0   0   0   0   0  
 0   0   0   8   0   0   0   0  

 0   0   0   0   0   0   1   0  
 0   0   2   0   0   0   0   0  
 0   0   0   0   0   0   0   3  
 0   4   0   0   0   0   0   0  
 0   0   0   0   5   0   0   0  
 6   0   0   0   0   0   0   0  
 0   0   0   0   0   7   0   0  
 0   0   0   8   0   0   0   0  

 0   0   0   0   0   0   1   0  
 0   0   0   2   0   0   0   0  
 0   3   0   0   0   0   0   0  
 0   0   0   0   4   0   0   0  
 0   0   0   0   0   0   0   5  
 6   0   0   0   0   0   0   0  
 0   0   7   0   0   0   0   0  
 0   0   0   0   0   8   0   0  

 0   0   0   0   0   0   1   0  
 0   0   0   2   0   0   0   0  
 0   3   0   0   0   0   0   0  
 0   0   0   0   0   0   0   4  
 0   0   0   0   0   5   0   0  
 6   0   0   0   0   0   0   0  
 0   0   7   0   0   0   0   0  
 0   0   0   0   8   0   0   0  

 0   0   0   0   0   0   1   0  
 0   0   0   0   2   0   0   0  
 0   0   3   0   0   0   0   0  
 4   0   0   0   0   0   0   0  
 0   0   0   0   0   5   0   0  
 0   0   0   0   0   0   0   6  
 0   7   0   0   0   0   0   0  
 0   0   0   8   0   0   0   0  

 0   0   0   0   0   0   0   1  
 0   2   0   0   0   0   0   0  
 0   0   0   3   0   0   0   0  
 4   0   0   0   0   0   0   0  
 0   0   0   0   0   0   5   0  
 0   0   0   0   6   0   0   0  
 0   0   7   0   0   0   0   0  
 0   0   0   0   0   8   0   0  

 0   0   0   0   0   0   0   1  
 0   2   0   0   0   0   0   0  
 0   0   0   0   3   0   0   0  
 0   0   4   0   0   0   0   0  
 5   0   0   0   0   0   0   0  
 0   0   0   0   0   0   6   0  
 0   0   0   7   0   0   0   0  
 0   0   0   0   0   8   0   0  

 0   0   0   0   0   0   0   1  
 0   0   2   0   0   0   0   0  
 3   0   0   0   0   0   0   0  
 0   0   0   0   0   4   0   0  
 0   5   0   0   0   0   0   0  
 0   0   0   0   6   0   0   0  
 0   0   0   0   0   0   7   0  
 0   0   0   8   0   0   0   0  

 0   0   0   0   0   0   0   1  
 0   0   0   2   0   0   0   0  
 3   0   0   0   0   0   0   0  
 0   0   4   0   0   0   0   0  
 0   0   0   0   0   5   0   0  
 0   6   0   0   0   0   0   0  
 0   0   0   0   0   0   7   0  
 0   0   0   0   8   0   0   0  

共有92种放置方法。

Process finished with exit code 0

用C++再现一次。这次皇后的编号根据所在列进行编号为0-7,用一维数组queen进行记录。每次放置皇后前,确定与之前放置的皇后无冲突。较之前面的算法要优化很多。程序采用goto跳转的方式,让代码精简到接近极致。

#include <iostream>
using namespace std;
int queen[8], tally=0;
void dfs(int n) {
    if (n == 8) {
        tally++;
        for (int i = 0; i < 8; i++) cout << queen[i] << "  ";
        cout << endl;
        return;
    }
    for (int j = 0; j < 8; j++) {
        queen[n] = j;
        for (int k = 0; k < n; k++) 
            if (queen[k] == queen[n] || abs(k - n) == abs(queen[k] - queen[n]))goto screen;
        dfs(n + 1);
        screen:;
    }
}
int main(){
    dfs(0); 
    cout << tally << endl;
    return 0;
}

运行结果:

0  4  7  5  2  6  1  3
0  5  7  2  6  3  1  4
0  6  3  5  7  1  4  2
0  6  4  7  1  3  5  2
1  3  5  7  2  0  6  4
1  4  6  0  2  7  5  3
1  4  6  3  0  7  5  2
1  5  0  6  3  7  2  4
1  5  7  2  0  3  6  4
1  6  2  5  7  4  0  3
1  6  4  7  0  3  5  2
1  7  5  0  2  4  6  3
2  0  6  4  7  1  3  5
2  4  1  7  0  6  3  5
2  4  1  7  5  3  6  0
2  4  6  0  3  1  7  5
2  4  7  3  0  6  1  5
2  5  1  4  7  0  6  3
2  5  1  6  0  3  7  4
2  5  1  6  4  0  7  3
2  5  3  0  7  4  6  1
2  5  3  1  7  4  6  0
2  5  7  0  3  6  4  1
2  5  7  0  4  6  1  3
2  5  7  1  3  0  6  4
2  6  1  7  4  0  3  5
2  6  1  7  5  3  0  4
2  7  3  6  0  5  1  4
3  0  4  7  1  6  2  5
3  0  4  7  5  2  6  1
3  1  4  7  5  0  2  6
3  1  6  2  5  7  0  4
3  1  6  2  5  7  4  0
3  1  6  4  0  7  5  2
3  1  7  4  6  0  2  5
3  1  7  5  0  2  4  6
3  5  0  4  1  7  2  6
3  5  7  1  6  0  2  4
3  5  7  2  0  6  4  1
3  6  0  7  4  1  5  2
3  6  2  7  1  4  0  5
3  6  4  1  5  0  2  7
3  6  4  2  0  5  7  1
3  7  0  2  5  1  6  4
3  7  0  4  6  1  5  2
3  7  4  2  0  6  1  5
4  0  3  5  7  1  6  2
4  0  7  3  1  6  2  5
4  0  7  5  2  6  1  3
4  1  3  5  7  2  0  6
4  1  3  6  2  7  5  0
4  1  5  0  6  3  7  2
4  1  7  0  3  6  2  5
4  2  0  5  7  1  3  6
4  2  0  6  1  7  5  3
4  2  7  3  6  0  5  1
4  6  0  2  7  5  3  1
4  6  0  3  1  7  5  2
4  6  1  3  7  0  2  5
4  6  1  5  2  0  3  7
4  6  1  5  2  0  7  3
4  6  3  0  2  7  5  1
4  7  3  0  2  5  1  6
4  7  3  0  6  1  5  2
5  0  4  1  7  2  6  3
5  1  6  0  2  4  7  3
5  1  6  0  3  7  4  2
5  2  0  6  4  7  1  3
5  2  0  7  3  1  6  4
5  2  0  7  4  1  3  6
5  2  4  6  0  3  1  7
5  2  4  7  0  3  1  6
5  2  6  1  3  7  0  4
5  2  6  1  7  4  0  3
5  2  6  3  0  7  1  4
5  3  0  4  7  1  6  2
5  3  1  7  4  6  0  2
5  3  6  0  2  4  1  7
5  3  6  0  7  1  4  2
5  7  1  3  0  6  4  2
6  0  2  7  5  3  1  4
6  1  3  0  7  4  2  5
6  1  5  2  0  3  7  4
6  2  0  5  7  4  1  3
6  2  7  1  4  0  5  3
6  3  1  4  7  0  2  5
6  3  1  7  5  0  2  4
6  4  2  0  5  7  1  3
7  1  3  0  6  4  2  5
7  1  4  2  0  6  3  5
7  2  0  5  1  4  6  3
7  3  0  2  5  1  6  4
92
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值