|
大家好,我是爱分享的小蓝,欢迎交流指正~?
?
🔎题目1-八皇后
传送门:?[USACO1.5]八皇后 Checker Challenge - 洛谷

???样例输入
? ?样例输出
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)

特殊情况特殊处理——打表也是个不错的选择~嘿嘿。
?🔎题目?2-八皇后·改
传送门:蓝桥杯算法提高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)

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