洛谷P1219 [USACO1.5]八皇后 Checker Challenge dfs记录 python实现

花了一个晚上的时间写了一下,最后三个测试点TLE,确实写得很繁琐而且很麻烦,但做出来了还挺开心的

n=int(input().strip())
a=[]
aa=[]
b=[]
c=[]
result=[]
for l in range(0,n):
    for g in range(0,n):
        aa.append(0)
    b.append(aa)
    aa=[]
#这里通过迭代构造b,(属于是非常麻烦且复杂)

# b=[[0]*n]*n#b表示整个图,记录被ban掉的点  这里有很大问题!!!!不能用这种方法构建!!!
num=0
def dfs(m):#a是标记数组,记录每一行棋子的位置,m指要确定哪一行的棋子位置
    #确定每行棋子所在的位置
    global a,b,n,num
    for i in range(0,n):#i表示列
        flag=0
        if  m>=n:#越界条件所有行都判断完
            num+=1
            if num<=3:
                for h in range(0,n):
                    print(a[h],end=' ')
                print('')
            return
        for q in range(0,n):
            if b[m][q]==0:#m表示行,q表示列
                flag=1#表示这一行有空着的点位,可以放棋子
                break
        if(flag==0):#第m行的点全部被ban,不可行,那么此时要返回上一步释放点位
            return
        if b[m][i]!=1:#如果该点没被ban则能取
            #表示这一层ban之前的状态
            aa=[]
            c=[]
            for l in range(0,n):
                for g in range(0,n):
                    aa.append(b[l][g])
                c.append(aa)
                aa=[]
            a.append(i+1)#表示第m行棋子的位置
            # print(a)
            b[m][i]=2
            #ban点操作
            j=m+1
            while j<n :
                b[j][i]=1
                j+=1
            k=1
            while m+k<n and i+k<n:
                b[m+k][i+k]=1
                k+=1
            k=1
            while m+k<n and i-k>=0:
                b[m+k][i-k]=1
                k+=1
            # print('ban点:')
            # for o in range(0,n):
            #     print(b[o])
            # print('\n')
        else:
            continue
        dfs(m+1)
        b=[]
        aa=[]
        for l in range(0,n):
            for g in range(0,n):
                aa.append(c[l][g])
            b.append(aa)
            aa=[]
        a.pop()
        # print('释放点:')
        # for o in range(0,n):
        #     print(b[o])
        # print('\n')
        # 释放ban点
dfs(0)
print(num)

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值