博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
N皇后(递归+回溯)
阅读量:342 次
发布时间:2019-03-04

本文共 3230 字,大约阅读时间需要 10 分钟。

伪代码

dfs函数(x) {
if x==n {
//如果x等于n了,说明每行的皇后都放置完毕 //将棋盘内容的快照保存下来 return } for(y=0;i

python3

class Solution(object):    def solveNQueens(self, n):        # 生成N*N的棋盘,填充棋盘,每个格子默认是''.''表示没有放置皇后        arr = [["." for _ in range(n)] for _ in range(n)]  # 生成列表最好方式是采用列表推导式        res = []  # 存放最终结果        # 检查当前的行和列是否可以放置皇后        def check(x: int, y: int):            # 检查竖着的一列是否有皇后            for i in range(x):                if arr[i][y] == "Q":                    return False            # 检查左上的斜边是否有皇后            i, j = x - 1, y - 1            while i >= 0 and j >= 0:                if arr[i][j] == "Q":                    return False                i, j = i - 1, j - 1            # 检查左下的斜边是否有皇后            i, j = x - 1, y + 1            while i >= 0 and j < n:                if arr[i][j] == "Q":                    return False                i, j = i - 1, j + 1            # 检查右上的斜边是否有皇后            i, j = x + 1, y - 1            while i < n and j >= 0:                if arr[i][j] == "Q":                    return False                i, j = i + 1, j - 1            # 检查右下的斜边是否有皇后            i, j = x + 1, y + 1            while i < n and j < n:                if arr[i][j] == "Q":                    return False                i, j = i + 1, j + 1            return True        def dfs(x):            # x是从0开始计算的            # 当x==n时所有行的皇后都放置完毕,此时记录结果            if x == n:                res.append(["".join(arr[i]) for i in range(n)])                return            # 遍历每一列            for y in range(n):                # 检查[x,y]这一坐标是否可以放置皇后                # 如果满足条件,就放置皇后,并继续检查下一行                if check(x, y):                    arr[x][y] = "Q"  # 放上皇后                    dfs(x + 1)  # 搜索下一行策略                    arr[x][y] = "."  # 撤销皇后,y进入下一列搜索        dfs(0)        return resprint(len(Solution().solveNQueens(8)))

利用一个规律改进算法。之前check()是循环,效率不高。

python3

class Solution(object):    def solveNQueens(self, n):        # 生成N*N的棋盘,填充棋盘,每个格子默认是''.''表示没有放置皇后        arr = [["." for _ in range(n)] for _ in range(n)]  # 生成列表最好方式是采用列表推导式        res = []  # 存放最终结果        columns = set()        hypotenuse1 = set()        hypotenuse2 = set()        # 检查当前的行和列是否可以放置皇后        def check(x: int, y: int):            if y in columns:                return False            if x - y in hypotenuse1:                return False            if x + y in hypotenuse2:                return False            return True        def dfs(x):            # x是从0开始计算的            # 当x==n时所有行的皇后都放置完毕,此时记录结果            if x == n:                res.append(["".join(arr[i]) for i in range(n)])                return            # 遍历每一列            for y in range(n):                # 检查[x,y]这一坐标是否可以放置皇后                # 如果满足条件,就放置皇后,并继续检查下一行                if check(x, y):                    columns.add(y)                    hypotenuse1.add(x - y)                    hypotenuse2.add(x + y)                    arr[x][y] = "Q"  # 放上皇后                    dfs(x + 1)  # 搜索下一行策略                    arr[x][y] = "."  # 撤销皇后,y进入下一列搜索                    columns.remove(y)                    hypotenuse1.remove(x - y)                    hypotenuse2.remove(x + y)        dfs(0)        return resprint(Solution().solveNQueens(8))

在这里插入图片描述

在这里插入图片描述

转载地址:http://sdce.baihongyu.com/

你可能感兴趣的文章