2018阿裏編程測驗題:最短漢密爾頓回路
阿新 • • 發佈:2018-08-12
ann 之間 math pre tar get 進行 public 訪問
N個城市,要求走一條最短的回路
import java.util.Arrays; import java.util.Scanner; public class Main { class Point { int x, y; Point(int x, int y) { this.x = x; this.y = y; } } //最終的答案 int ans = Integer.MAX_VALUE; //visited[i]表示第i個地點被訪問過 boolean visited[]; //存儲全部地點 Point[] a; //起點 Point start = new Point(0, 0); //求兩個點之間的距離 int getDis(Point x, Point y) { return Math.abs(x.x - y.x) + Math.abs(x.y - y.y); } /** * 遞歸求解 * * @param cur 當前所在位置 * @param dis 當前已經走過的距離 * @param visitCount 已經訪問的城市個數,用來記錄遞歸終點 **/ void go(Point cur, int dis, int visitCount) { if (visitCount == visited.length) {//如果已經訪問完了,更新答案 ans = Math.min(ans, dis + getDis(start, cur)); } //利用到起點的距離剪枝 if (dis > ans) { return; } //利用到終點的距離剪枝 if (dis + getDis(cur, start) > ans) { return; } //對於每個未曾訪問的城市進行處理 for (int i = 0; i < visited.length; i++) { if (!visited[i]) { visited[i] = true; go(a[i], dis + getDis(cur, a[i]), visitCount + 1); visited[i] = false; } } } Main() { Scanner cin = new Scanner(System.in); int n = cin.nextInt(); a = new Point[n]; visited = new boolean[n]; for (int i = 0; i < n; i++) { int pos[] = Arrays.stream(cin.next().split(",")).mapToInt(Integer::parseInt).toArray(); a[i] = new Point(pos[0], pos[1]); } go(new Point(0, 0), 0, 0); System.out.println(ans); } public static void main(String[] args) { new Main(); } }
2018阿裏編程測驗題:最短漢密爾頓回路