原题链接:蓝桥杯基础练习VIP-2n皇后问题
解题思路:n皇后详解
n=int(input())
table=[]
for _ in range(n):
table.append(list(map(int,input().split())))
def black_check(x,y):
#检查当前是否可以放棋子
if table[x][y]==0:
return False
#检查竖直有没有黑棋子
for i in range(x):
if table[i][y]=='b':
return False
#检查主对角线有没有黑棋子
i,j=x-1,y-1
while i>=0 and j>=0:
if table[i][j]=='b':
return False
i,j=i-1,j-1
#检查副对角线有没有黑棋子
i,j=x-1,y+1
while i>=0 and j=0 and j>=0:
if table[i][j]=='w':
return False
i,j=i-1,j-1
#检查副对角线有没有白棋子
i,j=x-1,y+1
while i>=0 and j<n:
if table[i][j]=='w':
return False
i,j=i-1,j+1
return True
cnt=0
def b_dfs(b_x):
#print('我进来了b_dfs')
global cnt
global table
if b_x==n:
# print('黑' ,table)
# 黑棋子放好了放白棋子
w_dfs(0)
return
for y in range(n):
if black_check(b_x,y):
table[b_x][y]='b'
b_dfs(b_x+1)
table[b_x][y]=1
return
def w_dfs(w_x):
global cnt
global table
#print('我进来了w_dfs')
if w_x==n:
#白棋子放完了,数量加1
cnt+=1
#print('白',table)
return
for y in range(n):
if white_check(w_x,y):
table[w_x][y]='w'
w_dfs(w_x+1)
table[w_x][y]=1
return
b_dfs(0)
print(cnt)0.0分
6 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复