碰到一个笔试题,类似于公交车站查询.求最优路径.用穷举做了一个简单的实现(其实这里是考递归方法,并不是真正的解决如何公交线路,查询公交站到站,需要结合公交线,公交车,公交站以及相互之间的交叉进行综合考虑)
粗略测试以map存储信息
需求:AB5,BC4,CD8,DC8,DE6,AD5,CE2,EB3,AE7 (AB5表示可以从A站到B站,距离为5,但是不能从B到A)
粗略穷举
package com.sohu.sc.resteasy.test;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
public class TestBus {
public static Map<String, Map<String, Integer>> m = new HashMap<String,Map<String, Integer>>();
/**
* 结果集:arr[0]-符合条件结果集,如CD8,DE6,EB3,BC4
* arr[1]-总路程
*/
public static LinkedList<String[]> result = new LinkedList<String[]>();
public static String start="A";
public static String end ="C";
public static void main(String[] args) {
//初始化
Map<String, Integer> a = new HashMap<String, Integer>();
a.put("B", 5);
a.put("D", 5);
a.put("E", 7);
m.put("A",a);
Map<String, Integer> b = new HashMap<String, Integer>();
b.put("C", 4);
m.put("B",b);
Map<String, Integer> c = new HashMap<String, Integer>();
c.put("D", 8);
c.put("E",2);
m.put("C",c);
Map<String, Integer> d = new HashMap<String, Integer>();
d.put("C", 8);
d.put("E",6);
m.put("D",d);
Map<String, Integer> e = new HashMap<String, Integer>();
e.put("B", 3);
m.put("E",e);
//初始化一个当前路径
result.push(new String[]{"","0"});
find(start);
result.removeLast();
//所有结果集
for (String[] s :result) {
System.out.println(s[0] + " : " + s[1]);
}
}
public static void find(String key) {
/* 基本穷举递归思路 ,结果集末尾始终存储当前全路径 current*/
//是否需要对子站点进行递归查询
boolean recursionChild = false;
String first= result.getLast()[0];
String second=result.getLast()[1];
for (String s : m.get(key).keySet()) {
if (s.equals(end)) {
//查到终点站((last要保证最新))
String[] last = result.getLast();
Integer len = m.get(key).get(s);
if (last[0].equals("")) {
last[0] = key + end + len;
} else {
last[0] = last[0] + ","+ key + end + len;
}
last[1] = Integer.parseInt(last[1]) + len + "";
//重置当前路径(相当于在当前路径前插入一条匹配记录)
result.addLast(new String[]{first,second});
} else {
//继续往下查(last要保证最新)
String[] last1 = result.getLast();
//过滤规则,此处的规则是行程不可逆向,也就是中间站不可重复,不能出现首尾站
if (last1[0].contains(s)) continue;
recursionChild = true;
Integer l = m.get(key).get(s);
if (last1[0].equals("")) {
last1[0] = key + s + l;
} else {
last1[0] = last1[0] + ","+ key + s + l;
}
last1[1] = Integer.parseInt(last1[1]) + l + "";
find(s);
}
//重置当前 路劲(递归查询子站点,当前路径可能会发生改变)
if (recursionChild) {
result.getLast()[0] = first;
result.getLast()[1] = second;
}
}
}
}
此类穷举查询效率并不是很好,而且查询所有的组合,没有必要, 需要结合具体的公交路线进行优化优选