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.image
image

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)))
posted @ 2025-11-04 17:06  Amy-xue  阅读(14)  评论(0)    收藏  举报