zoukankan      html  css  js  c++  java
  • 深度遍历实例(阿里评测编程)

    复习下深度遍历~

    题目简述:给定二维列表,可以任意位置出发,可以上下左右四个方向移动,只朝着比当前位置元素小的方向移动,输出所有可能得最长路径以及移动的步数。

    思考:

    1、考虑到每步上下左右四个方向试探,满足情况时选择一个方向移动,不满足时回退到上一个位置,选择其他满足的方向移动,即深度遍历。

    2、每移动一步后到达新位置,继续从新位置出发移动又是类似的操作,所以可以用递归实现。

    3、题中有个小的技巧,为的是求最长的路径,所以本想着遍历二维列表每个元素为任意的起点,分别找到相应最长的最后进行比较。现在的做法是:之前遍历过的点已经存储了最长的路径,就没有必要再重复遍历。

    步骤:

    了解完题干后,递归函数只需要四个参数,当前坐标点x,y,移动步数step,记录路径path。

    1、在当前位置,先循环四个方向进行尝试。

    2、尝试过程中判断下一位置是否越界,是否满足条件,满足条件后递归step+1步。

    3、当无路可走时,记录最长路径以及步数。

     1 #coding:utf-8
     2 a = [[19,20,18],[17,15,16],[15,14,30],[14,2,21]]
     3 #b用来在深度优先遍历中标记是否遍历过,b_all:循环任意位置做起点时,标记该起点在之前是否已经遍历过
     4 b = [[0,0,0],[0,0,0],[0,0,0],[0,0,0]]
     5 b_all = [[0,0,0],[0,0,0],[0,0,0],[0,0,0]]
     6 #a数组的大小m行n列
     7 m,n = 4,3
     8 #root是最终输出的最长路径
     9 root = []
    10 path = []
    11 max_path = 0
    12 #代表四个方向位置的移动
    13 next = [(0,1),(1,0),(0,-1),(-1,0)]
    14 def dfs(x, y , step, path):
    15     global max_path, a, b, m, n, root, b_all, next
    16     if path ==None:
    17         path = []
    18     path.append((x,y))
    19     #按照右下左上的顺序枚举四个方向
    20     for i in range(4):
    21         tx = x + next[i][0]
    22         ty = y + next[i][1]
    23         #判断是否越界
    24         if(tx < 0) or (ty<0) or ty> n-1 or tx>m-1:
    25             continue
    26         #判断是否满足条件以及是否走过
    27         if a[tx][ty] <a[x][y] and b[tx][ty]==0:
    28             # 标记这个点走过
    29             b[tx][ty] = 1 
    30             # 标记已经遍历过这个点
    31             b_all[tx][ty] = 1 
    32             # 开始尝试下一个点
    33             dfs(tx,ty,step+1,path) 
    34             #尝试结束,取消这个点的标记
    35             b[tx][ty] =0
    36             
    37     #当所有方向尝试完,没有可以走的方向为止,记录下最长的路径以及步数
    38     if step>max_path:
    39         root=path[:]
    40         max_path = step
    41     return
    42 
    43 for i in range(m):
    44     for j in range(n):
    45         #遍历每个未遍历过的元素为起点
    46         if b_all[i][j]==0:
    47             x,y = i,j
    48             dfs(x,y,0,None)
    49             
    50 print max_path,root
    深度遍历

    一般的dfs基本模型:

    def dfs(step):
        判断边界
        尝试每一种可能 
        for i in range(n):
            继续下一步dfs(step+1)
        返回
  • 相关阅读:
    AngularJS 拦截器
    android的Log日志打印管理工具类(一)
    android的Home键的监听封装工具类(一)
    android开发SDcard 响应的文件相关处理(一)
    android开发时间和日期的代码实现工具类(一)
    android文件和图片的处理工具类(一)
    android的二进制和十六进制的相互转换工具类(一):
    android的color整理(一)
    android经典Demo(转载)
    Android 根据EditText搜索框ListView动态显示数据
  • 原文地址:https://www.cnblogs.com/hithink/p/7275342.html
Copyright © 2011-2022 走看看