解题思路:
先放置黑皇后,黑皇后放置完毕后,在黑皇后已占位的基础上开始放置白皇后,一个回合实际上既包括放置黑皇后也包括放置白皇后,待黑白皇后都放置完毕后,再恢复现场,进入下一轮

参考代码:

from collections import defaultdict
#defaultdict作用与字典相同,但是在字典中没有对应键的时候可以赋予规定的初始值,不会报错,这里填入参数为bool表示初始值为False
def dfs1(index):
    #先放黑皇后
    if n<=0:
        return 0
    if index==n:
        dfs2(0)
        #黑皇后放置完毕,在此基础上,放置白皇后
        return
    for i in range(n):
        if not col1[i] and not dia_10[index+i] and not dia_11[index-i] and board[index][i]=='1':
            #绘图可得,同一主对角线的元素横纵坐标和相同
            #同一副对角线的元素横纵坐标差相同
            col1[i]=True
            dia_10[index+i]=True
            dia_11[index-i]=True
            board[index][i]='0'
            dfs1(index+1)
            #恢复现场,确保寻找下一个正确方案时的初始现场正常
            col1[i]=False
            dia_10[index+i]=False
            dia_11[index-i]=False
            board[index][i]='1'
    return
def dfs2(index):
    #再放白皇后
    global nums
    if index==n:
        nums+=1
        #白黑皇后均可以妥善放置,才能算作一次正确方案
        return
    for i in range(n):
        if not col2[i] and not dia_20[index+i] and not dia_21[index-i] and board[index][i]=='1':
            col2[i]=True
            dia_20[index+i]=True
            dia_21[index-i]=True
            board[index][i]='0'
            dfs2(index+1)
            col2[i]=False
            dia_20[index+i]=False
            dia_21[index-i]=False
            board[index][i]='1'
    return
while True:
    try:
        n=int(input())
        board=[]
        for i in range(n):
            board.append(input().split())
        col1=defaultdict(bool)#黑皇后列
        dia_10=defaultdict(bool)#黑皇后主对角线
        dia_11=defaultdict(bool)#黑皇后副对角线
        col2=defaultdict(bool)#白皇后列
        dia_20=defaultdict(bool)#白皇后主对角线
        dia_21=defaultdict(bool)#白皇后副对角线
        nums=0
        dfs1(0)#从第0行开始放置黑皇后
        print(nums)
    except:
        break


点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论