[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)
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)