小test

     碰到一个笔试题,类似于公交车站查询.求最优路径.用穷举做了一个简单的实现(其实这里是考递归方法,并不是真正的解决如何公交线路,查询公交站到站,需要结合公交线,公交车,公交站以及相互之间的交叉进行综合考虑)

     粗略测试以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;
			}
		}
	}
}
      此类穷举查询效率并不是很好,而且查询所有的组合,没有必要, 需要结合具体的公交路线进行优化优选

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值