25fall做题记录 - November
2025.11.1
括号生成
向右或向上走,不能超过对角线。
Catalan数枚举。
class Solution:
def generateParenthesis(self, n: int) -> list[str]:
ans=[]
def dfs(l,res,r):
if(l<r):
return
if(l+r==2*n-1):
ans.append(res+')')
return
if(l<n):
dfs(l+1,res+'(',r)
if(l>r):
dfs(l,res+')',r+1)
dfs(1,"(",0)
return ans
print(Solution().generateParenthesis((3)))
N 皇后
class Solution:
def solveNQueens(self, n: int) -> list[list[str]]:
y=[0]*n
z=[0]*(2*n+1)
w=[0]*(2*n+1)
ans=[]
def dfs(x,res):
if(x==n):
tmp=[]
for i in range(n):
t='.'*res[i]+'Q'+'.'*(n-1-res[i])
tmp.append(t)
ans.append(tmp)
return
for i in range(n):
if(y[i]==0 and z[i+x]==0 and w[i-x+n]==0):
y[i]=1
z[i+x]=1
w[i-x+n]=1
temp=res.copy()
temp.append(i)
dfs(x+1,temp)
y[i]=0
z[i+x]=0
w[i-x+n]=0
dfs(0,[])
return ans
print(Solution().solveNQueens(4))
熄灯问题
根据题目提示,枚举第一行的所有情况,然后一行行往下推,直到遇到刚好全部关闭的情况。
二维数组的深拷贝需用copy库中的deepcopy().
from copy import deepcopy
a=[]
a.append([0]*8)
for i in range(5):
t=list(map(int,input().split()))
t.insert(0,0)
t.append(0)
a.append(t)
a.append([0]*8)
qaq=deepcopy(a)
ans=[[0 for _ in range(8)]for _ in range(7)]
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]
def button(i,j):
for k in range(4):
x0 = i + dx[k]
y0 = j + dy[k]
a[x0][y0] ^= 1
a[i][j] ^= 1
ans[i][j] ^= 1
def change():
for i in range(2,6):
for j in range(1,7):
if(a[i-1][j]==1):
button(i,j)
for i in range(1<<6):
a=deepcopy(qaq)
ans = [[0 for _ in range(8)] for _ in range(7)]
# if(i==37):
# for j in range(1,6):
# print(" ".join(map(str, a[j][1:7])))
# print("TEST")
for k in range(6):
if(i&(1<<k)):
button(1,k+1)
# if(i==37):
# for j in range(1,6):
# print(" ".join(map(str, a[j][1:7])))
# print("TEST")
change()
if(sum(a[5][1:7])==0):
for j in range(1, 6):
print(" ".join(map(str,ans[j][1:7])))
break
# if(i==37):
# for j in range(1,6):
# print(" ".join(map(str, a[j][1:7])))
# print("TEST")
# for j in range(1,6):
# print(" ".join(map(str, ans[j][1:7])))
2025.11.4
马走日
t=int(input())
dx=[-2,-1,1,2,2,1,-1,-2]
dy=[1,2,2,1,-1,-2,-2,-1]
ans=0
def dfs(x,y,step):
global ans
if(step==m*n):
ans+=1
return
for i in range(8):
x0=x+dx[i]
y0=y+dy[i]
if(0<=x0<n and 0<=y0<m and vis[x0][y0]==0):
vis[x0][y0]=1
dfs(x0,y0,step+1)
vis[x0][y0]=0
for i in range(t):
n,m,x,y=map(int,input().split())
vis=[[0 for _ in range(m)]for _ in range(n)]
vis[x][y]=1
ans=0
dfs(x,y,1)
print(ans)
排列
1.康托展开+逆康托展开。还原的过程中使用小根堆。阶乘使用math库中的factorial.
康托展开
2.

from math import factorial
import heapq
m=int(input())
for p in range(m):
n,k=map(int,input().split())
a=list(map(int,input().split()))
ans=[]
t=0
count=[0]*n
for i in range(n):
for j in range(i,n):
if(a[j]<a[i]):
count[i]+=1
for i in range(n):
t+=factorial(n-1-i)*count[i]
t+=k
t=(t+1)%(factorial(n))-1
for i in range(n):
temp=t//factorial(n-1-i)
ans.append(temp)
t=t-temp*factorial(n-1-i)
res=[]
nums=[]
heapq.heapify(nums)
for i in range(1,n+1):
nums.append(i)
for i in range(n):
qwq=nums[ans[i]]
res.append(qwq)
nums.remove(qwq)
print(" ".join(map(str,res)))

浙公网安备 33010602011771号