蓝桥备赛——DFS

news/2024/6/29 12:03:05 标签: 宽度优先, 深度优先, 算法

废话不多说,先上题

对应代码如下: 


def dfs(x,y):
    global num
    for i in range(0,4):
        dir=[(-1,0),(0,-1),(1,0),(0,1)]
        nx,ny=x+dir[i][0] ,y+dir[i][1]
        if nx<0 or nx>=hx or ny <0 or ny>wy: continue
        if mp[nx][ny]=='*':
            num+=1
            print("%d:%s->%d%d"%(num,p[x][y],nx,ny))
            continue
        if mp[nx][ny]=='.':
            mp[nx][ny]='#'
            p[nx][ny]=p[x][y]+'->'+str(nx)+str(ny)
            dfs(nx,ny)
            mp[nx][ny]='.'
num=0
wy,hx=map(int,input().split())
a=['']*10
for i in range(wy):
    a[i]=list(input())
mp=[['']*(10) for i in range(10)]
for x in range(hx):
    for y in range(wy):
        mp[x][y]=a[y][x]
        if mp[x][y]=='@': sx=x;sy=y
        if mp[x][y]=='*': tx=x;ty=y
print("from %d%d to %d%d"%(sx,sy,tx,ty))
p=[['']*(10) for i in range(10)]
p[sx][sy]=str(sx)+str(sy)
dfs(sx,sy)

几句话简单解释一下DFS,就是deep search嘛,搜索不到底不结束,我的记忆方式就是“不撞南墙不回头”,哈哈哈。对应的含义就是,在树结构的搜索过程中,始终要搜索到最深层树结构,然后再返回上一层进行下一步搜索,再次搜索到最深层,如此反复,直到搜索完全路径并将符合结果输出。

紧接着,解释一下上面的代码

经过几道DFS,亦或是BFS的题目训练,我发现其中其实是有讨论可循的。

比如,都存在一个位移数组列表,[(0,1),(1,0),(-1,0),(0,-1)],当然,也有里面没有使用元组,使用的list of list格式的情况。

上面是第一个转移搜索目标所需要的模块,第二个模块就是格式化输入了,把题目所需要输入的数据全都接受起来,一般对于Python就是map函数+input().split()了。

再就是第三个模块,也是最重要的,就是对应的搜索了。首先需要明确终止条件,然后再展开用代码描述思路。

上面题目中直接将搜索的全过程集成到一个函数中了,这样其实也更加方便main函数中直接调用即可。

对于DFS内部的迭代,其实就是用代码语言来阐述题干想要表达的内容了。就是一个转化的过程。

此外,再有一个格式化输出的模块,使用print("from %d%d to %d%d"%(sx,sy,tx,ty))


http://www.niftyadmin.cn/n/5456262.html

相关文章

RAFT:让大型语言模型更擅长特定领域的 RAG 任务

RAFT&#xff08;检索增强的微调&#xff09;代表了一种全新的训练大语言模型&#xff08;LLMs&#xff09;以提升其在检索增强生成&#xff08;RAG&#xff09;任务上表现的方法。“检索增强的微调”技术融合了检索增强生成和微调的优点&#xff0c;目标是更好地适应各个特定领…

FLStudio多少钱FL Studio中文版软件序列号-激活码购买

fl studio是一款编曲软件&#xff0c;接触这款软件的大多都是做音乐的小伙伴吧&#xff0c;对于初学者想了解这款软件在意的应该就是它的价格。很多打算入手正版FL Studio的新手朋友都会纠结一个问题&#xff1a;哪个版本的FL Studio更适合我&#xff0c;到底应该入手哪一款FL …

C++从入门到精通——C++输入和输出

C输入和输出 前言一、C打印Hello World二、C输入&输出关于I/O流C输入&输出cout函数cin函数endl函数 三、C输入和输出的说明printf、scanf和cout、cin的区别cout函数和cin函数控制精度和宽度std命名空间的使用惯例 前言 C中的输入和输出主要通过标准库中的iostream类实…

Java学习记录第十三天

面向对象编程 核心思想就是OOP&#xff08;面向对象编程&#xff09; 面向过程&面向对象 面向过程思想 步骤清晰简单&#xff0c;第一步做什么&#xff0c;第二步做什么... 面对过程适合处理一些较为简单的问题 面向对象思想 物以类聚&#xff0c;分类的思维模式&…

高防服务器、高防IP、高防CDN的工作原理是什么

高防IP高防CDN我们先科普一下是什么是高防。“高防”&#xff0c;顾名思义&#xff0c;就犹如网络上加了类似像盾牌一样很高的防御&#xff0c;主要是指IDC领域的IDC机房或者线路有防御DDOS能力。 高防服务器主要是比普通服务器多了防御服务&#xff0c;一般都是在机房出口架设…

力扣---最长公共子序列---二维动态规划

思想&#xff1a; 定义g[i][j]&#xff1a;text1的前i位和text2的前j位的最长公共子序列长度。递推公式&#xff1a;如果text[i]text[j]&#xff0c;那么只需要看g[i-1][j-1]即可&#xff0c;此时g[i][j]g[i-1][j-1]1。如果text[i]!text[j]&#xff0c;那么g[i][j]max(g[i-1][j…

Android上执行shell命令的总结

Android提供了两种执行shell命令的方法。 1.Runtime.getRuntime().exec(cmds) 2.ProcessBuilder(cmds) 两种方法背后的逻辑相同。都是创建一个新的进程&#xff0c;执行shell命令。本文以第一种方法为例。代码如下&#xff1a; public class RuntimeExcUtil {public static…

武汉星起航公司助力零经验新手卖家征战亚马逊跨境电商市场

在数字化浪潮的推动下&#xff0c;亚马逊跨境电商行业正逐渐成为众多创业者和企业家们的新战场。然而&#xff0c;对于零经验的新手卖家而言&#xff0c;这片广袤的电商海洋无疑充满了未知与挑战。在这个关键时刻&#xff0c;武汉星起航公司以其专业的服务和深厚的行业积累&…