蓝桥杯 第五十九天 递推与递归(复习)

递归实现指数型枚举

def dfs(cur,path):
    if cur==n+1:
        for i in path:
            print(i,end=" ")
        print()
        return
    dfs(cur+1, path)
    dfs(cur+1,path+[cur])
    return
n=int(input())
dfs(1,[])

递归实现排列型枚举

def dfs(path):
    if len(path)==n:
        for i in path:
            print(i,end=" ")
        print()
        return
    for i in range(1,n+1):
        if not vis[i]:
            vis[i]=True
            dfs(path+[i])
            vis[i]=False
    return
n=int(input())
vis=[False for i in range(n+1)]
dfs([])

简单斐波那契

n=int(input())
a,b=0,1
for i in range(n):
    if i==0:
        print(0,end=" ")
    elif i==1:
        print(1,end=" ")
    else:
        a, b = b, b + a
        print(b,end=" ")

费解的开关

数组备份问题

import copy


def isvalid(x,y):
    if x<0 or x>=5:
        return False
    if y<0 or y>=5:
        return False
    return True
dx=[1,-1,0,0]
dy=[0,0,1,-1]
def turn(x,y):
    adj[x][y]=1-adj[x][y]
    return
def click(x,y):
    turn(x,y)
    for i in range(4):
        nx=x+dx[i]
        ny=y+dy[i]
        if isvalid(nx,ny):
            turn(nx,ny)
    return
n=int(input())
for m in range(n):
    radj=[]
    for i in range(5):
        radj.append(list(map(int,list(input()))))
    ans=1<<31

    for i in range(1<<5):
        adj = copy.deepcopy(radj)
        curans=0
        for k in range(5):
            cur=i>>k&1
            if cur==1:
                click(0,k)
                curans+=1
        for row in range(4):
            for col in range(5):
                if adj[row][col]==0:
                    click(row+1,col)
                    curans+=1
                    if curans>6:
                        break
            if curans>6:
                break
        if adj[-1].count(0)==0 and curans<=6:
            ans=min(ans,curans)
    if ans>1<<30:
        print(-1)
    else:
        print(ans)
    if m!=n-1:
        input()

递归实现组合型枚举

def dfs(path):
    if len(path)==m:
        for i in path:
            print(i,end=" ")
        print()
        return
    if not path:
        cur=0
    else:
        cur=path[-1]
    for i in range(cur+1,n+1):
        if not vis[i]:
            vis[i]=True
            dfs(path+[i])
            vis[i]=False
    return
n,m=map(int,input().split())
vis=[False for i in range(n+1)]
dfs([])

带分数

def isvalid(path):
    #path="123456789"
    for i in range(9):
        if int(path[:i+1])>n:
            break
        cur=int(path[:i+1])
        res=n-cur
        #左边是i+1,右边是8
        start=(i+1+8)//2
        for j in range(start,8):
            mid=int(path[i+1:j+1])
            right=int(path[j+1:])
            # print(path,cur,mid,res)
            if mid%right==0 and (mid//right)==res:
                return True
    return

def dfs(path):
    global ans
    if len(path)==9:
        if isvalid(path):
            ans+=1
        return
    for i in range(1,10):
        if not vis[i]:
            vis[i]=True
            dfs(path+str(i))
            vis[i]=False
vis=[False for i in range(10)]
n=int(input())
ans=0
dfs("")
print(ans)

飞行员兄弟

import copy
def turn(x,y):
    global curadj
    if curadj[x][y]=='+':
        curadj[x][y]='-'
    else:
        curadj[x][y]='+'
    return
def click(x,y):
    for i in range(4):
        turn(x,i)
        turn(i,y)
    turn(x,y)
    return
def getans():
    global ans
    global curadj
    global path
    for k in range(1<<16):
        curans=0
        curpath=[]
        curadj=copy.deepcopy(adj)
        for i in range(3,-1,-1):
            for j in range(3,-1,-1):
                index=i*4+j
                if k>>index&1:
                    click(i,j)
                    curans+=1
                    curpath.append((i+1,j+1))
        flag=True
        for i in curadj:
            if i.count('+')!=0:
                flag=False
                break
        if flag:
            if curans<ans:
                ans=curans
                path=curpath
            elif curans==ans:
                path=curpath
adj=[]
for i in range(4):
    adj.append(list(input()))
curadj=[]
path=[]
ans=1<<31
getans()
print(ans)
for i in path[::-1]:
    print(i[0],i[1])

翻硬币

懵逼树下懵逼果,懵逼ac你和我

def click(x):
    if a[x]=='o':
        a[x]='*'
    else:
        a[x]='o'
    if a[x-1]=='o':
        a[x-1]='*'
    else:
        a[x-1]='o'
    return
a=list(input())
b=list(input())
n=len(a)
ans=0
for i in range(n-1):
    if a[i]!=b[i]:
        ans+=1
        click(i+1)
print(ans)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值