深度优先搜索(dfs)
深度优先搜索是将当前状态按你定的规则去走路,走了一步他的状态就是走了一步的状态。然后把这个新状态递归我们定的规则。如果走不下去了就后退一步,在上一个状态去找一条路去走,如果还没有就再回去一步。直到找到目标状态或者走完所有的路简而言之就是不撞南墙不回头。撞了南墙就后退一步去看看还有没有别的南墙可以走过去撞。
以下题为例题
5、编程实现,有一个nxm(1≤n,m≤100)的矩阵,且短阵中每个方格中都有一个整数(0≤
整数≤100),小蓝需要按照以下要求从短阵中找出一条最长的移动路线,且输出最长路线的
长度(1个方格为一个长度)。
要求:
小蓝可以从矩阵中任意一个方格开始向他的上下左右相邻的件意一个方格移动,且移动的路
线不能有交叉。小蓝每次所要移动的方格中的整数都要小于当前所在方格的整数(如当前所
在的方格中的整数为3,那么可以移动到数字0,1,2格子里,不能移动到数字4的格
子里)。
def find(jvzhen):
def dfs(x,y,pre):
if x<0 or x>=n or y<0 or y>=m or jvzhen[x][y]>=pre:
return 0
longest=0
directions=[(1,0),(-1,0),(0,1),(0,-1)]
for dx,dy in directions:
longest=max(longest,1+dfs(x+dx,y+dy,jvzhen[x][y]))
return longest
n=len(jvzhen)
m=len(jvzhen[0])
maxpath=0
for i in range(n):
for j in range(m):
maxpath=max(maxpath,dfs(i,j,float('inf')))
return maxpath
jvzhen=[[3,2,1],
[3,4,5],
[2,1,3]]
result=find(jvzhen)
print("最长路径长度",result)
代码解析:
if x<0 or x>=n or y<0 or y>=m or jvzhen[x][y]>=pre:
判断是否越界或下一个方格的数是否大于等于前一个方格的数
directions=[(1,0),(-1,0),(0,1),(0,-1)]
for dx,dy in directions:
longest=max(longest,1+dfs(x+dx,y+dy,jvzhen[x][y]))
在上下左右四个方向中找到最长的路径
for i in range(n):
for j in range(m):
maxpath=max(maxpath,dfs(i,j,float('inf')))
为了将每个方格作为起点调用深度优先搜索的方法来找到最长的路径
ps:float('inf'):表示无穷