java面试题之 城市之间路段的问题

引用http://bbs.csdn.net/topics/390773701

这里贴出自己实现的代码:


在A,B两个城市之间设有N个路站(如下图中的S1,且N<100),城市与路站之间、路站和路站之间各有若干条路段(各路段数≤20,且每条路段上的距离均为一个整数)。
A,B的一条通路是指:从A出发,可经过任一路段到达S1,再从S1出发经过任一路段,…最后到达B。通路上路段距离之和称为通路距离(最大距离≤1000)。当所有的路段距离给出之后,求出所有不同距离的通路个数(相同距离仅记一次)。
例如:下图所示是当N=1时的情况:


迭代算法:

import java.util.HashSet;

public class TestNode1 {

	public static void main(String[] args) {
		int[][] distance = { { 5, 7, 4 }, { 6, 5 } };
		HashSet<Integer> setG = new HashSet<Integer>();

		for (int i = 0; i < distance.length; i++) {
			HashSet<Integer> temp = new HashSet<Integer>();
			temp.addAll(setG);
			setG.clear();
			for (int dd : distance[i]) {
				if (i == 0) {
					setG.add(dd);
				}
				for (int d : temp) {
					setG.add(d + dd);
				}
			}
		}

		System.out.println(setG);
	}
}

迭代算法:

该算法的数据结构设计时,参考了图结构的思想,所以有点笨重;


这是其他稍复杂的一个例子来验证:


输出的结果是:

[13, 14, 15, 17, 16, 19, 18, 21, 20, 23, 22, 25, 24, 27, 26, 29, 28, 30]


import java.util.HashSet;
import java.util.Set;

public class TestNode1 {
	static Set setG = new HashSet();// 用来装不同的 可行的 通路长度

	public static void main(String[] args) {
		int[] d4 = { 8, 4, 3 };
		int[] d3 = { 1, 2 };
		int[] d2 = { 10, 9, 8, 4 };
		int[] d1 = { 5, 8, 10 };
		Node n5 = new Node(null, null);// 终点
		Node n4 = new Node(d4, n5);
		Node n3 = new Node(d3, n4);
		Node n2 = new Node(d2, n3);
		Node n1 = new Node(d1, n2);

		search(n1, n3, 0);
		System.out.println(setG);// 输出可行的通路长度
	}

	static void search(Node start, Node end, int dis) {
		if (start.next != null) {
			for (int distance : start.distanceToNext) {
				int temp = dis + distance;
				search(start.next, end, temp);
			}
		} else {
			setG.add(dis);
		}
	}

}

class Node {
	int[] distanceToNext;// 到下一个节点的各个距离
	Node next;// 下一个节点

	public Node(int[] d, Node next) {
		distanceToNext = d;
		this.next = next;
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值