解决了一个博问里的问题,挺简单的,记下来满足自己的小小成就感

先贴问题:http://q.cnblogs.com/q/77610/

 

public static string[] Stops = new string[] { "AB", "BC", "CD", "DC", "DE", "AD", "CE", "EB", "AE" };

 算法:列举数组中包含的任意2个字母之间的路径集合。

比如:A-C  就有 ABC (AB - BC), ADC (AD - DC)
View Code

自己只学过简单的数据结构,所以才把这么简单的问题拿出来啊,见谅了~

 

根据问题,可以抽象为,给你一组点与点之间的联系,然后再给你一个起始点和终止点,你把所有符合的路径打印出来就完了。

很简单,用有向图啊,但是前提是输入数据不能构成环,否则程序就循环起来没完了~

贴代码:

 1 package cnblogs;
 2 
 3 import java.util.Stack;
 4 
 5 /**
 6  * Created by Kischn on 2015/11/21.
 7  */
 8 public class Test {
 9 
10     /**
11      * 有向图
12      * 构造数据时得保证不能有环
13      */
14     public static boolean[][] m = new boolean[26][26];
15 
16     /**
17      * 打印走过的路经
18      * @param way
19      */
20     public static void printWay(Stack<Integer> way){
21         for(Integer node : way){
22             System.out.print((char)(node + 'A'));
23         }
24         System.out.println();
25     }
26 
27     /**
28      * 查找结束点,并记录走的路径
29      * @param stack
30      * @param way
31      * @param end
32      */
33     public static void find(Stack<Integer> stack, Stack<Integer> way, int end){
34         if(stack.isEmpty()) return;
35         Integer tmp = stack.pop();
36         way.add(tmp);
37         if(tmp == end){//end node found
38             printWay(way);
39         }else {
40             for (int i = 0; i < 26; i++) {
41                 if (m[tmp][i]) {
42                     stack.push(i);
43                     find(stack, way, end);
44                 }
45             }
46         }
47         way.pop();
48     }
49 
50     public static void main(String[] args) {
51         String[] stops = new String[] { "AB", "BC", "CD", "DC", "DE", "AD", "CE", "EB", "AE" };
52         char start = 'A';
53         char end = 'C';
54 
55         char a,b;
56         for(int i = 0; i < stops.length; i++){
57             a = stops[i].charAt(0);
58             b = stops[i].charAt(1);
59             m[a - 'A'][b -'A'] = true;
60         }
61         Stack<Integer> way = new Stack<Integer>();
62         Stack<Integer> stack = new Stack<Integer>();
63         stack.push(start - 'A');
64         find(stack, way, end - 'A');
65     }
66 
67 }

 

你可能感兴趣的:(解决了一个博问里的问题,挺简单的,记下来满足自己的小小成就感)