用栈和递归求解两顶点的所有简单路径

用栈和递归求解两顶点的所有简单路径

栈和递归在程序设计中的应用是非常广的,比如对于迷宫的求解、表达式的求解,等都可以用栈来解决,典型的hanoi塔问题,树和图的遍历等都可以用递归来解决,在数据结构等很多书中都有介绍,如果对此不了解,可去参考。递归算法的设计实际上就是对问题的抽象的过程,如果抽象到每个小问题都有相同特征时,那就形成了递归,递归算法简明易懂,下面我就介绍一种利用到栈与递归求解两顶点所有简单路径的问题。

  先说明一下什么叫“两顶点的所有简单路径”的概念,“两顶点的所有简单路径”的意思通熟的讲就是在图中有若干点,点与点之间可有边相连(在数据结构中叫“图”),任意设个起点和终点,现在要求的是从起点到终点所有可能通过的边序列的集合。(注:是简单有序边,也就是说简单路径,所谓简单路径就是序列中顶点不重复出现的路径。)举个例子:从上海到北京,我可以直接到达,也可以先到四川,再到北京,或者先到广东,再到北京,等等。如:上海->四川->上海->北京,这就不是简单路径了,显然,不是简单的路径有无数条。

为了描述方便,我用了简单的二维数组来做存储结构。(当然,完全可以用邻接矩阵、邻接表、十字链表、邻接多重表等来表示)* * *

* * *

* * *

如上图左上角的坐标为(1,1),右上角的坐标为(3,1),左下角的坐标为(1,3),右下角的坐标为(3,3),点与点之间都可相通,假设从点(1,1)要到(3,3),有多少种走法?

对这个问题的求解先要认识到它的本质,其本质是一个点有四个方向(各边特殊处理),依次探索四个方向上的点,判断是不是最后的目的地,如果是,则进栈并返回,如果不是则进栈,将此点同样上述处理。显然这个过程是一个递归的过程,直到是最后的目的地,才层层返回。

当然,解决此问题不是只有栈与递归才能解决,经我自己摸索,用生成树的方法访问其双亲结点,也可解决,如果有更好的方法,请多多指教。

你可能感兴趣的:(数据结构,算法)