蓝桥备赛——DFS

废话不多说,先上题

对应代码如下: 


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))

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牛哥带你学代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值