(蓝桥杯)DFS+BFS算法题目-python

DFS

1.排列数字

dfs和递归差不多,具体图示如下图:
在这里插入图片描述
在这里插入图片描述

N=10
path=[0]*N
state=[False]*N
def dfs(u):
    if u==n:
        for i in range(n):
            print(path[i],end=' ')
        print()
    for i in range(n):
        if state[i]==False:
            path[u]=i+1 
            state[i]=True
            dfs(u+1)   #处理下一个位置
            path[u]=0  #恢复现场
            state[i]=False 
n=int(input()) #输入有n个数
dfs(0) #从第0个位置开始处理       
2.n皇后问题

在这里插入图片描述
在这里插入图片描述

.Q..
...Q
Q...
..Q.

..Q.
Q...
...Q
.Q..

def dfs(x,y,queue):
    if y==n:
        x,y=x+1,0
    #分支:放皇后
    if x==n:
        if queue==n:
            for i in range(n):
                for j in range(n):
                    print(chessboard[i][j],end='')
                print()
            print()
        return #如果皇后没放完,说明此种摆放不行
    if not row[x] and not col[y] and not dg[x+y] and not udg[y-x+n]:
        chessboard[x][y]='Q'
        row[x],col[y],dg[x+y],udg[y-x+n]=1,1,1,1
        dfs(x,y+1,queue+1) #处理下一个皇后和下一个位置
        row[x],col[y],dg[x+y],udg[y-x+n],chessboard[x][y]=0,0,0,0,'.'
    #分支:不放
    dfs(x,y+1,queue) #该位置不能放皇后,则看下一个位置可以不
if __name__=='__main__':
    N=10 
    n=int(input())
    chessboard=[['.' for _ in range(N)] for _ in range(N)]
    row,col,dg,udg=[0]*N,[0]*N,[0]*2*N,[0]*2*N
    dfs(0,0,0) #从第0行第0列,第0个皇后开始处理

BFS

走迷宫

在这里插入图片描述

输入样例:
5 5
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0
输出样例:
8
def bfs():
    #上下,左右移动
    dx=[-1,0,1,0] 
    dy=[0,1,0,-1] 
    queue=[(0,0)] #从左上角开始
    trace[0][0]=0
    while queue:
        x,y=queue.pop(0)
        if (x,y)==(n-1,m-1): #到达右下角
            return trace[x][y]
        for i in range(4): #在上下左右移动
            a=x+dx[i]
            b=y+dy[i]
            if 0<=a<n and 0<=b<m and graph[a][b]!=1 and trace[a][b]==-1: #没有走过,并且不是墙
                queue.append((a,b)) #这个位置可以走,并加入队列处理
                trace[a][b]=trace[x][y]+1 #该位置到原点的距离
N=101
n,m=map(int,input().split())
graph=[[0]*N for _ in range(N)] #迷宫地图初始化
trace=[[-1]*N for _ in range(N)] #行走轨迹
for i in range(n):
    graph[i][0:m]=list(map(int,input().split())) #迷宫建图
print(bfs()) #进行宽度优先搜索

在这里插入图片描述

青蛙跳杯子

在这里插入图片描述

x=input()
y=input()
move=[1,-1,2,-2,3,-3] #记录所有运动方式
aset={x} 
def bfs():
  Q=[(x,0)] #队列中放入初始队列,以及初始步数
  while Q: #依次出队,对每个状态进行处理
    old=Q.pop(0)
    for i in move:
      a=list(old[0])
      b=old[1]
      c=a.index('*') #记录*所在的下标
      d=c+i #与*要交换元素的下标
      if 0<=d<len(x):
        a[c]=a[d]
        a[d]='*'
        e=''.join(a)
        b+=1 #进行一部操作
        if e==y:
          print(b)
          return 
        if e not in aset: #如果此时变换的序列之前没有出现
          aset.add(e)
          Q.append((e,b)) #变换后的序列和更新的步数入队。
bfs()
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值