标签:
先贴问题: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)
自己只学过简单的数据结构,所以才把这么简单的问题拿出来啊,见谅了~
根据问题,可以抽象为,给你一组点与点之间的联系,然后再给你一个起始点和终止点,你把所有符合的路径打印出来就完了。
很简单,用有向图啊,但是前提是输入数据不能构成环,否则程序就循环起来没完了~
贴代码:
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 }
解决了一个博问里的问题,挺简单的,记下来满足自己的小小成就感
标签:
原文地址:http://www.cnblogs.com/kischn/p/4985286.html