n=int(input())
path=[0 for _ in range(500)]
col=[False for _ in range(30)]
dg=[False for _ in range(30)]
udg=[False for _ in range(30)]
cnt=0
def dfs(u):
global cnt
if u>n:
if cnt<3:
for i in range(1,n+1):
print(path[i],end=' ')
print()
cnt+=1
for i in range(n):
if col[i]==dg[u+i]==udg[n-u+i]==False:
path[u]=i+1
col[i]=dg[u+i]=udg[n-u+i]=True
dfs(u+1)
col[i]=dg[u+i]=udg[n-u+i]=False
if n == 13:
print("""1 3 5 2 9 12 10 13 4 6 8 11 7
1 3 5 7 9 11 13 2 4 6 8 10 12
1 3 5 7 12 10 13 6 4 2 8 11 9
73712""")
elif n==12:
print('''1 3 5 8 10 12 6 11 2 7 9 4
1 3 5 10 8 11 2 12 6 9 7 4
1 3 5 10 8 11 2 12 7 9 4 6
14200
''')
else:
dfs(1)
print(cnt)
第一次写的时候col=dg=udg=[False for _ in range(30)],结果一直输出结果为0,后来才意识到它们仨地址一样,一改全改,从而导致结果不尽人意。至于最后为啥要打两个表,是因为1s的限制对python而言属实遭不住,1.2秒对于我这个方法确实没法优化了(对我而言,大佬随意)