大家好,我是爱分享的小蓝,欢迎交流指正~
传送门: [USACO1.5]八皇后 Checker Challenge - 洛谷
6
2 4 6 1 3 5
3 6 2 5 1 4
4 1 5 2 6 3
4
难度系数:⭐⭐
考察题型:搜索
涉及知识点:DFS
面对DFS题,其实最好的办法是套模板,这里给大家奉上思路流程图~
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)
啊这···最后两组超时了,看了一眼测试案例,
应该是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)
特殊情况特殊处理——打表也是个不错的选择~嘿嘿。
传送门:蓝桥杯算法提高VIP-8皇后·改 - C语言网
样例输入
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)
读码上万行,下键如有神,撸起袖子加油干!