python 最后三个点TLE,求助

P1219 [USACO1.5] 八皇后 Checker Challenge

ISAQ @ 2023-04-07 09:21:09

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=[]
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()
dfs(0)
print(num)

by cornwave @ 2023-06-29 19:46:44

python的时间限制也是1s吗……如果是的话建议换c++


by ISAQ @ 2024-03-05 08:48:40

@cornwave 时间限制估计是一样的,不过要备赛蓝桥杯python组哈哈哈TvT


|