题目:
当你看到你的室友比你更有魅力时,你决定每晚跑步,因为他/她经常锻炼。
现在你有一本北京地名词典。它的形式是{location:elevation}。在百度地图上找到的连接各个地方的距离数组。
请找出最短路线的长度,在这条路线上你可以完全上坡,然后完全下坡。假设你住在"Huilongguan"(回龙观),
字典为elevations = {"Huilongguan": 5, "Chaoyang Park": 25, "National Stadium": 15, "Olympic Park": 20, "Tsinghua University": 10}
路径为:
paths = {
("Huilongguan", "Chaoyang Park"): 10,
("Huilongguan", "National Stadium"): 8,
("Huilongguan", "Olympic Park"): 15,
("Chaoyang Park", "Olympic Park"): 12,
("National Stadium", "Tsinghua University"): 10,
("Olympic Park", "Tsinghua University"): 5,
("Olympic Park", "Huilongguan"): 17,
("Tsinghua University", "Huilongguan"): 10
}
得到的最短的路径为:"Huilongguan" -> "National Stadium" -> "Tsinghua University" -> "Huilongguan", 最短距离为 28
代码:
public class HiretualTest {
int ans = Integer.MAX_VALUE;
public static void main(String[] args) {
// 为地名编码
// {"Huilongguan": 0, "Chaoyang Park": 1, "National Stadium": 2, "Olympic Park": 3, "Tsinghua University": 4}
int[][] dirs = new int[5][5];
dirs[0][1] = 10;
dirs[0][2] = 8;
dirs[0][3] = 15;
dirs[1][3] = 12;
dirs[2][4] = 10;
dirs[3][4] = 5;
dirs[3][0] = 17;
dirs[4][0] = 10;
HiretualTest main = new HiretualTest();
main.dfs(dirs, 0, 0);
System.out.println(main.ans);
}
private void dfs(int[][] dirs, int i, int sum){
if (i == 0 && sum != 0) {
ans = Math.min(ans, sum);
return;
}
for (int j = 0; j < dirs[0].length; ++j)
if (dirs[i][j] > 0)
dfs(dirs, j, sum + dirs[i][j]);
}
}