阿里面试题(练习)

题目:

如下图,某物流派送员p,需要给 a、b、c、d. 4个快递点派送包裹,请问派送员需要选择什么样的路线,才能完成最短路程的派送。假设如图派送员的起点坐标(0,0),派送路线只能沿着图中的方格边行驶,每个小格都是正方形,且边长为1,如p到d的距离就是4。随机输入n个派送点坐标,求输出最短派送路线值(从起点开始完成n个点派送并回到起始点的距离)

输入示例: 

2,2 
2,8 
4,4 
7,2 
输出: 
30

Java实现:

package interview.tree.interview;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;


/**
 * 简单实现思路:BFS+回溯,任意一点开始,算到下一点的距离,置标;逐次迭代递归。
 */
public class Main {
    static final Point START = new Point(0, 0);
    static int minpath = Integer.MAX_VALUE;
    private static int min = 1000;
    public static final Point start = new Point(0, 0);

    public static int calculate(Point point, Point[] points, int sum, int count) {
        for (int i = 0; i < points.length; i++) {
            if (points[i].visited == false) {
                points[i].visited = true;
                count++;
                sum += point.getLength(points[i]);
                if (count == points.length) {
                    sum += points[i].getLength(start);
                    if (sum < min) {
                        min = sum;
                    }
                }
                calculate(points[i], points, sum, count);
                points[i].visited = false;
                sum -= point.getLength(points[i]);
                count--;
            }
        }
        return min;
    }

    public static void main(String[] args) {
        List<Point> points = new ArrayList<>();
        Scanner in = new Scanner(new BufferedReader(new InputStreamReader(System.in)));
        int t = Integer.parseInt(in.nextLine().trim());  // Scanner has functions to read ints, longs, strings, chars, etc.
        String inputPoint;
        for (int i = 1; i <= t; ++i) {
            inputPoint = in.nextLine();
            String[] coord = inputPoint.trim().split(",");
            Point newPooint = new Point(Integer.parseInt(coord[0]),Integer.parseInt(coord[1]));
            points.add(newPooint);
        }
        int min = calculate(START, (Point[]) points.toArray(new Point[points.size()]), 0, 0);
        System.out.println(min);
    }
}

class Point {
    int px;
    int py;
    boolean visited;
    public Point(int px, int py) {
        this.px = px;
        this.py = py;
        this.visited = false;
    }
    public int getLength(Point p) {
        return Math.abs(px - p.px) + Math.abs(py - p.py);
    }
}

 

posted @ 2018-08-04 17:16  一介草民李八千  阅读(209)  评论(0)    收藏  举报