跳转至

n皇后

题目描述

有一个N * N的矩阵方格和N个棋子,现在需要将N个棋子按要求放置到矩阵方格中。

要求如下:

1.任意两个棋子不能在同一行

2.任意两个棋子不能在同一列

3.任意两个棋子不能在同一对角线上(下图红色线段都为对角线)

根据以上要求,问N个棋子放置到N * N矩阵方格中有多少种放置方案

例如:4 * 4的矩阵方格,4个棋子,有2种放置方案

## 输入描述

输入一个正整数 N(1<N<11),表示一个 N*N 的矩阵方格和 N 个棋子数量

输出描述

输出 N 个棋子按要求放置到N * N的矩阵方格中有多少种放置方案

样例输入

4

样例输出

2

代码详解


展开查看

N = int(input())

chess = [['O' for i in range(N)] for j in range(N)]

def checkcol(col):
    for row in range(N):
        if chess[row][col] == 'X':
            return False
    return True

def checkslant(row, col):
    for k in range(1, N):
        d = [(k,k), (-k,-k), (k,-k), (-k,k)]
        for i,j in d:
            if 0<=row+i<N and 0<=col+j<N and chess[row+i][col+j] == 'X':

                return False
    return True

def dfs(row):
    global cnt
    if row == N:
        # for i in chess:
        #     for j in i:
        #         print(j, end=' ')
        #     print()
        # print()
        cnt += 1
        return
    for col in range(N):
        if checkcol(col) and checkslant(row, col):
            chess[row][col] = 'X'
            dfs(row+1)
            chess[row][col] = 'O'
cnt = 0
dfs(0)
print(cnt)

运行结果

展开查看
4
2