编程语言
首页 > 编程语言> > Python解决n皇后

Python解决n皇后

作者:互联网

问题: 将n个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击,给你一个整数n,返回所有不同的n皇后问题的解决方案

1.1<=n<=9

2.该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位

3.皇后彼此不能相互攻击,也就是说:任何两个皇后都不能处于同一条横行,纵行或斜线上

def gen_board(n, queens):
    result = []
    rows = ["."] * n
    for i in range(n):
        rows[queens[i]] = "Q"
        result.append("".join(rows))
        rows[queens[i]] = "."
    return result


def back_track(line_num, n, queens, solutions, columns, diagonal1, diagonal2):
    if line_num == n:
        result = gen_board(n, queens)
        solutions.append(result)
        return
    for i in range(n):
        if i in columns or line_num - i in diagonal1 or line_num + i in diagonal2:
            continue
        queens[line_num] = i
        columns.add(i)
        diagonal1.add(line_num - i)
        diagonal2.add(line_num + i)
        back_track(line_num + 1, n, queens, solutions, columns, diagonal1, diagonal2)
        columns.remove(i)
        diagonal1.remove(line_num - i)
        diagonal2.remove(line_num + i)


def solve_n_queens(n):
    solutions = []
    queens = [-1] * n
    # 判断是否在一列
    columns = set()
    # 左斜线(左斜线上的每个值 横坐标减纵坐标 相等)
    diagonal1 = set()
    # 右斜线(右斜线上的每个值 横坐标加纵坐标 相等)
    diagonal2 = set()
    back_track(0, n, queens, solutions, columns, diagonal1, diagonal2)
    return solutions


if __name__ == '__main__':
    a = solve_n_queens(4)
    print(len(a))
    for x in a:
        print("*" * 20)
        for y in x:
            print(y)

标签:Python,num,diagonal2,diagonal1,解决,皇后,line,columns,queens
来源: https://blog.csdn.net/weixin_44689630/article/details/120517275