【抽象DFS/四维坐标/全局变量/最大值】八皇后/改

[USACO1.5]八皇后 Checker Challenge - 洛谷

n=int(input())
x,y,z1,z2=[0]*n,[0]*n,[0]*(2*n),[0]*(2*n)

def dfs(i,list1):
    global cnt
    if i>=n:
        cnt+=1
        if cnt<=3:
            print(*list1)
            #print(*list2)
        return

    for j in range(n):
            if y[j]!=1 and z1[i+j]!=1 and z2[i-j+n]!=1:
                y[j],z1[i+j],z2[i-j+n]=1,1,1
                x[i]=1
                dfs(i+1,list1+[j+1])
                y[j], z1[i + j], z2[i-j+n] = 0, 0, 0

cnt=0
dfs(0,[])
print(cnt)

需要注意的是左斜和右斜在同一行都可以用x,y的代数和来判断,同一左斜↗的棋子 i+j是一个定值,同一右斜↘的棋子 i-j是一个定值,不过会出现负数,所以整体加个n防止出现负数索引。

通过这样来查询四个方向是否有其他的棋子存在。

因为python速度太慢了,需要剪枝,但目前并不知道如何剪枝,因为样例比较少,故可以用打表法,选择将n=12,n=13得到答案在打印出来。

n=int(input())
x,y,z1,z2=[0]*n,[0]*n,[0]*(2*n),[0]*(2*n)

def dfs(i,list1):
    global cnt
    if i>=n:
        cnt+=1
        if cnt<=3:
            print(*list1)
            #print(*list2)
        return

    for j in range(n):
            if y[j]!=1 and z1[i+j]!=1 and z2[i-j+n]!=1:
                y[j],z1[i+j],z2[i-j+n]=1,1,1
                x[i]=1
                dfs(i+1,list1+[j+1])
                y[j], z1[i + j], z2[i-j+n] = 0, 0, 0

cnt=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(0, [])
    print(cnt)

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

n=8
mg=[]
x,y,z1,z2=[0]*n,[0]*n,[0]*2*n,[0]*2*n
for i in range(n):
    list1=list(map(int,input().split()))
    mg.append(list1)
#print(mg)

def dfs(i,sums):
    global maxn
    if i>=n:
        maxn=max(maxn,sums)
        return
    for j in range(n):
        if y[j]!=1 and z1[i+j]!=1 and z2[i-j+n]!=1:
            y[j],z1[i+j],z2[i-j+n]=1,1,1
            x[i]=1
            dfs(i+1,sums+mg[i][j])
            y[j], z1[i + j], z2[i-j+n] = 0,0,0

maxn=0
dfs(0,0)
print(maxn)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值