Java、中心城市

        给定一组城市,中心城市是和其它所有城市具有最短距离的城市。编写一个程序,提示用户输入城市数目以及位置(坐标),找到中心城市以及与其他城市总距离。


测试数据: 

2.5 5 5.1 3 1 9 5.4 54 5.5 2.1


package pack2;

import java.util.Scanner;

import javafx.geometry.Point2D;

public class CentralCity {	

	public static void main(String[] args) {
		centralCity();
	}

	public static void centralCity() {
		try(Scanner input = new Scanner(System.in);) {
			System.out.print("Enter the number of cities: ");
			Point2D[] cities = new Point2D[input.nextInt()];
			
			System.out.println("Enter the coordinates of the cities: ");
			for (int i = 0; i < cities.length; i++) 
				cities[i] = new Point2D(input.nextDouble(), input.nextDouble());
			
			Point2D centralCity = getCentralCity(cities);
			System.out.println("The central city is at (" + centralCity.getX() + ", "
                     + centralCity.getY() + ")");
			System.out.println("The total distance to all other cities is " + 
                     getDistance(cities, centralCity));
		}
	}
	
	/**获取中心城市*/
	public static Point2D getCentralCity(Point2D[] cities) {
		double[][] distance = new double[cities.length][cities.length];	//距离二维数组
		double sum = 0, minDistances = 0;	//距离和、最短距离
		Point2D centralCity = cities[0];	//当前中心城市
		
		for (int i = 0; i < distance.length; i++) 
			for (int j = 0; j < distance[i].length; j++) {
                    //i行j列存储第i城市与第j城市的距离
	        	distance[i][j] = cities[j].distance(cities[i]);	
				if(i == 0) minDistances += distance[i][j];	//获取首个最短距离
			}
		
		for (int i = 0; i < distance.length; i++) {
			sum = 0;
			for (int j = 0; j < distance[i].length; j++) 
				sum += distance[i][j];	//第i个城市与其他城市的距离之和
			
			if(sum < minDistances) {	//获取最短距离城市
				minDistances = sum;
				centralCity = cities[i];
			}
		}
		
		return centralCity;
	}
	
	/**获取中心城市与其他城市距离*/
	public static double getDistance(Point2D[] cities, Point2D centralCity) {
		double distance = 0;	//距离
		
		for (int i = 0; i < cities.length; i++) 
                //如果城市不为中心城市,distance加上中心城市与此城市的距离
            if(!centralCity.equals(cities[i]))	
				distance += centralCity.distance(cities[i]);
		return distance;
	}
}

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值