计算两点之间的最短距离

  • 格式:pdf
  • 大小:40.12 KB
  • 文档页数:2

计算两点之间的最短距离

题⽬链接:

题⽬⼤意:

给定N个点的坐标,找出距离最短的两个点的序号.如果最短距离相同,输出序号最⼩的⼀组.

题⽬要求输出三种不同计算⽅式下的最短距离序号:

欧⼏⾥得距离:Math.sqrt(|x2-x1|2+|y2-y1|2)

曼哈顿距离:|x2-x1|+|y2-y1|

棋盘距离:Math.max(|x2-x1|,|y2-y1|)

因为N的个数是5000个,可以直接双重循环取得最⼩距离. 单纯的理解⼀下三种距离.

Accept代码:

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.util.ArrayList;

import java.util.List;

import java.util.StringTokenizer;

public class source {

public static void main(String[] args) throws IOException {

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

StringTokenizer st = new StringTokenizer(br.readLine());

int N = Integer.parseInt(st.nextToken());

int[][] points = new int[N+1][2];

for(int i = 1;i<=N;i++){

st = new StringTokenizer(br.readLine());

points[i] = new int[]{Integer.parseInt(st.nextToken()),Integer.parseInt(st.nextToken())};

}

List result = getEuclidPosition(points);

for(int[] ans:result){

System.out.println(ans[0]+" "+ans[1]);

}

}

private static List getEuclidPosition(int[][] points){

double minEuclidDistance = Integer.MAX_VALUE;

int[] euclidPosition = new int[2];

double minCityDistance = Integer.MAX_VALUE;

int[] cityPosition = new int[2];

double minChessDistance = Integer.MAX_VALUE;

int[] chessPosition = new int[2];

CalcMinPoint calcMinPointEuclid;

CalcMinPoint calcMinPointCity;

CalcMinPoint calcMinPointChess;

for(int i = 1;i

for(int j = 1;j

if(i == j){

continue;

}

double euclidDistance = getEuclidDistance(points[i],points[j]);

double cityDistance = getCityDistance(points[i],points[j]);

double chessDistance = getChessDistance(points[i],points[j]);

calcMinPointEuclid = new CalcMinPoint(minEuclidDistance, euclidPosition, i, j, euclidDistance).invoke();

minEuclidDistance = calcMinPointEuclid.getMinEuclidDistance();

euclidPosition = calcMinPointEuclid.getEuclidPosition();

calcMinPointCity = new CalcMinPoint(minCityDistance, cityPosition, i, j, cityDistance).invoke();

minCityDistance = calcMinPointCity.getMinEuclidDistance();

cityPosition = calcMinPointCity.getEuclidPosition();

calcMinPointChess = new CalcMinPoint(minChessDistance, chessPosition, i, j, chessDistance).invoke();

minChessDistance = calcMinPointChess.getMinEuclidDistance();

chessPosition = calcMinPointChess.getEuclidPosition();

}

}

List result = new ArrayList();

result.add(euclidPosition);

result.add(cityPosition);

result.add(chessPosition);

return result;

}

private static double getChessDistance(int[] point, int[] point1) {

return Math.max(Math.abs(point[0]-point1[0]),Math.abs(point[1]-point1[1]));

}

private static double getCityDistance(int[] point, int[] point1) {

return Math.abs(point[0]-point1[0])+Math.abs(point[1]-point1[1]);

}

private static double getEuclidDistance(int[] p1, int[] p2){return Math.pow(p1[0]-p2[0],2)+Math.pow(p1[1]-p2[1],2);

}

private static class CalcMinPoint {

private double minEuclidDistance;

private int[] euclidPosition;

private int i;

private int j;

private double euclidDistance;

public CalcMinPoint(double minEuclidDistance, int[] euclidPosition, int i, int j, double euclidDistance) {

this.minEuclidDistance = minEuclidDistance;

this.euclidPosition = euclidPosition;

this.i = i;

this.j = j;

this.euclidDistance = euclidDistance;

}

public double getMinEuclidDistance() {

return minEuclidDistance;

}

public int[] getEuclidPosition() {

return euclidPosition;

}

public CalcMinPoint invoke() {

if(minEuclidDistance > euclidDistance){

minEuclidDistance = euclidDistance;

if(i < j){

euclidPosition = new int[]{i,j};

}

else{

euclidPosition = new int[]{j,i};

}

}

else if(minEuclidDistance == euclidDistance){

int position0 = -1;

int position1 = -1;

if(iposition0){

euclidPosition = new int[]{position0,position1};

}

else if(euclidPosition[0] == position0 && euclidPosition[1]>position1){

euclidPosition = new int[]{position0,position1};

}

}

return this;

}

}

}