python搜索DFS、BFS刷题

设置一个vip隐私,夹杂一些碎碎念......涉及到一些转自其他佬的题解

🚩flag为留存,等技术强硬再钻一把......

本章记录包含DFS、BFS所有相关

2024.4.1


**DFS**

74.分糖果

没整出来,糖果种类没处理好 分糖果

cnt = 0
def dfs(depth,n,m):
    global cnt
    if depth == 7:
        if n == 0 and m == 0:
            cnt += 1
        return
    for i in range(n+1):
        for j in range(m+1):
            if 2 <= i+j <= 5 and i <= n and j <= m:
                dfs(depth+1,n-i,m-j)
dfs(0,9,16)
print(cnt)

 75.全排列问题

理论上的第一道dfs练习,ac0,下为题解,即dfs一般格式 P1706全排列问题 - 洛谷

n = int(input())
via = [0] * (n+1)
a = [0] * (n+1)
b = [0] * (n+1)
def dfs(step):
    if step == n+1:
        for i in range(1,n+1):
            print("%5d" %b[i],end='')
        print()
        return
    for i in range(1,n+1):
        if via[i] == 0:
            b[step] = a[i]
            via[i] = 1
            dfs(step+1)
            via[i] = 0
for i in range(1,n+1):
    a[i] = i
dfs(1)

输出部分排列 

若想对输出部分排列,即n=4,m=3(打印n个数中任意m个数的排列方式),代码修改如下。主要修改在第7、8行n+1\rightarrowm+1

n = 4
m = 3
via = [0] * (n+1)
a = [0] * (n+1)
b = [0] * (n+1)
def dfs(step):
    if step == m+1:
        for i in range(1,m+1):
            print("%5d" %b[i],end='')
        print()
        return
    for i in range(1,n+1):
        if via[i] == 0:
            b[step] = a[i]
            via[i] = 1
            dfs(step+1)
            via[i] = 0
for i in range(1,n+1):
    a[i] = i
dfs(1)

DFS组合相关

学习跳转🔗 <蓝桥杯软件赛>零基础备赛20周--第12周--DFS基础(必考)-CSDN博客 

76.最大连通

没整出来,不知道四个方位如何整。题解代码好像和数据格式不匹配,不知道为啥,但最终由于填空题,结果ok了 最大连通

import os
import sys

# 请在此输入您的代码
dx = [-1,0,1,0]                                 #表示四个方位
dy = [0,1,0,-1]
n,m = 30,60
def dfs(x,y):
    if g[x][y] == '0':
        return 0
    g[x][y] = '0'
    cnt = 1
    for i in range(4):
        nx = x + dx[i]
        ny = y + dy[i]
        if nx < 0 or ny < 0 or nx >= n or ny >= m:
            continue
        cnt += dfs(nx,ny)
    return cnt
g = list()
for i in range(30):
    a = input()                                 #为适应题目提供数据
    g.append(list(input().strip()))
ans = 0
for i in range(n):
    for j in range(m):
        if g[i][j] == '1':
            ans = max(ans,dfs(i,j))
print(ans)

2024.4.2

77.全球变暖

//没做出来,还有点题目没了解明白。题目求问的是沉没岛屿数,上下左右both#称为岛屿。不过神奇的是这个正确题解在遇到海洋外both#也会判定为岛屿(其实不是)全球变暖

第二行sys.setrecursionlimit()设置递归深度,否则ac75%

import sys
sys.setrecursionlimit(60000) 
def dfs(x,y):
    dx = [0,0,1,-1]
    dy = [1,-1,0,0]
    global flag,vis,mp
    vis[x][y] = 1
    if mp[x][y+1] == '#' and mp[x][y-1] == '#' and mp[x-1][y] == '#' and mp[x+1][y] == '#':
        flag = 1
    for i in range(4):
        nx = x + dx[i]
        ny = y + dy[i]
        if vis[nx][ny] == 0 and mp[nx][ny] == '#':
            dfs(nx,ny)
n = int(input())
mp = []
for i in range(n):
    mp.append(list(input()))
vis = []
for i in range(n):
    vis.append([0] * n)
ans = 0
for i in range(n):
    for j in range(n):
        if mp[i][j] == '#' and vis[i][j] == 0:
            flag = 0
            dfs(i,j)
            if flag == 0:
                ans += 1
print(ans)

78.与或异或

没做出来,gpt也是 与或异或

  • 21
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值