【蓝桥Python每日一练】————八皇后(DFS棋盘)

大家好,我是爱分享的小蓝,欢迎交流指正~ 


题目1-八皇后

传送门: [USACO1.5]八皇后 Checker Challenge - 洛谷

【蓝桥Python每日一练】————八皇后(DFS棋盘)_第1张图片

   样例输入

6

   样例输出

2 4 6 1 3 5
3 6 2 5 1 4
4 1 5 2 6 3
4


题解

难度系数:⭐⭐

考察题型:搜索

涉及知识点:DFS

面对DFS题,其实最好的办法是套模板,这里给大家奉上思路流程图~

【蓝桥Python每日一练】————八皇后(DFS棋盘)_第2张图片


代码

n=int(input())
a,b,c,d=[0]*100,[0]*100,[0]*100,[0]*100
cnt=0
def dfs(i):
    global cnt,n,a,b,c,d
    if i>n:         #越界条件
        cnt+=1
        if cnt<=3:  #打印前三次
            for i in range(1,n+1):
                print(a[i],end=" ") 
            print() 
        return
    for j in range(1,n+1):
        if b[j]==0 and c[i+j]==0 and d[i-j+n]==0:#满足条件
            b[j],c[i+j],d[i-j+n]=1,1,1           #标记
            a[i]=j                               #赋值
            dfs(i+1)                             #递推
            b[j],c[i+j],d[i-j+n]=0,0,0           #回溯
dfs(1)
print(cnt)

【蓝桥Python每日一练】————八皇后(DFS棋盘)_第3张图片

 啊这···最后两组超时了,看了一眼测试案例,

应该是12和13没出来,这时一个大胆的想法冒出来( •̀ ω •́ )✧我要打表! 

n=int(input())
a,b,c,d=[0]*100,[0]*100,[0]*100,[0]*100
cnt=0
def dfs(i):
    global cnt,n,a,b,c,d
    if i>n:         #越界条件
        cnt+=1
        if cnt<=3:  #打印前三次
            for i in range(1,n+1):
                print(a[i],end=" ") 
            print() 
        return
    for j in range(1,n+1):
        if b[j]==0 and c[i+j]==0 and d[i-j+n]==0:#满足条件
            b[j],c[i+j],d[i-j+n]=1,1,1           #标记
            a[i]=j                               #赋值
            dfs(i+1)                             #递推
            b[j],c[i+j],d[i-j+n]=0,0,0           #回溯
if n==12:
    print("1 3 5 8 10 12 6 11 2 7 9 4")
    print("1 3 5 10 8 11 2 12 6 9 7 4")
    print("1 3 5 10 8 11 2 12 7 9 4 6")
    print(14200)
elif n==13:
    print("1 3 5 2 9 12 10 13 4 6 8 11 7")
    print("1 3 5 7 9 11 13 2 4 6 8 10 12")
    print("1 3 5 7 12 10 13 6 4 2 8 11 9")
    print(73712)
else:
    dfs(1)
    print(cnt)

【蓝桥Python每日一练】————八皇后(DFS棋盘)_第4张图片

特殊情况特殊处理——打表也是个不错的选择~嘿嘿。


 题目 2-八皇后·改

传送门:蓝桥杯算法提高VIP-8皇后·改 - C语言网

【蓝桥Python每日一练】————八皇后(DFS棋盘)_第5张图片

样例输入

1 2 3 4 5 6 7 8
9 10 11 12 13 14 15 16
17 18 19 20 21 22 23 24
25 26 27 28 29 30 31 32
33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48
48 50 51 52 53 54 55 56
57 58 59 60 61 62 63 64

样例输出

260

题解

难度系数:⭐⭐

考察题型:搜索

涉及知识点:DFS


代码

maps=[[int(i) for i in input().split()] for j in range(8)]
b,c,d=[0]*100,[0]*100,[0]*100
ans=-float("inf")#赋初值为最小值
def dfs(i,maxv):
    global ans,b,c,d
    if i==8:#越界条件
        ans=max(ans,maxv)
        return
    for j in range(8):
        if b[j]==0 and c[i+j]==0 and d[i-j+8]==0:#满足条件
            b[j],c[i+j],d[i-j+8]=1,1,1           #标记
            dfs(i+1,maxv+maps[i][j])             #递推
            b[j],c[i+j],d[i-j+8]=0,0,0           #回溯
dfs(0,0)
print(ans)


 读码上万行,下键如有神,撸起袖子加油干!

你可能感兴趣的:(备战蓝桥杯,搜索,python,蓝桥杯,算法,图论,深度优先)