学习Python从娃娃抓起!记录下蓝桥杯Python学习和备考过程中的题目,记录每一个瞬间。
附上汇总贴:小学生蓝桥杯Python闯关 | 汇总_COCOgsta的博客-CSDN博客
【题目描述】
有一个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