街区最短路径问题Java实现

描述 一个街区有很多住户,街区的街道只能为东西、南北两种方向。

住户只可以沿着街道行走。

各个街道之间的间隔相等。

用(x,y)来表示住户坐在的街区。

例如(4,20),表示用户在东西方向第4个街道,南北方向第20个街道。

现在要建一个邮局,使得各个住户到邮局的距离之和最少。

求现在这个邮局应该建在那个地方使得所有住户距离之和最小;

输入
第一行一个整数n<20,表示有n组测试数据,下面是n组数据;
每组第一行一个整数m<20,表示本组有m个住户,下面的m行每行有两个整数0<x,y<100,表示某个用户所在街区的坐标。
m行后是新一组的数据;
输出
每组数据输出到邮局最小的距离和,回车结束;
样例输入
2
3
1 1
2 1
1 2
5
2 9 
5 20
11 9
1 1
1 20
样例输出
2
44

算法分析:

本题算法较简单,遍历所有居民长方形居住区域的每一个点,计算改点和每个居民的和,然后比较每个点到用户的长度和大小,对于多组用户则放入一个三维数组中~

代码如下:

import java.util.*;
//import java.io.*;

public class Main 
{
	public static void main(String[] args) throws Exception
	{
	Scanner input = new Scanner(System.in);
	//System.out.println("请输入有几组人家");
	int row = input.nextInt();
	int[][][] house = new int[row][][];
	for(int index = 0; index < row ; index++)
		{
		//	System.out.println("请输入有几户人家第" + (index+1) + "组");
			int num = input.nextInt();
			house[index] = new int[num][2];
			for(int i = 0; i < num; i++)
			{
		//		System.out.println("请输入第" + index + "组第" + (i+1) + "户人家坐标");
				house[index][i][0] = input.nextInt();
				house[index][i][1] = input.nextInt();
			}
			
		}
		cal(house);
	
	}
	
	public static void cal(int a[][][])
	{
		
		int aa = a.length;
		int max = 0;
		int ret = 0;
		
		for(int i  = 0; i < aa; i++)
		{   
			int maxx = a[i][0][0];
			int maxy = a[i][0][1];
			int  distance = 0;
			int mindistance = 0;
			for(int i1 = 0; i1 < a[i].length; i1++)
			{
				if(a[i][i1][0] > maxx)
				{
					maxx = a[i][i1][0];
				}
			}
			for(int i1 = 0; i1 < a[i].length; i1++)
			{
				if(a[i][i1][1] > maxy)
				{
					maxy = a[i][i1][1];
				}
			}
			for(int x = 0; x < maxx+1; x++)
			{
				for(int y = 0; y < maxy+1; y++)
				{   
					distance = 0;
					for(int i1 = 0; i1 < a[i].length; i1++)
					{   
						
						distance = distance + Math.abs(x-a[i][i1][0])+Math.abs(y-a[i][i1][1]);
						if((x == 0) && (y == 0))
						{
							mindistance = distance;
						}
						
						
					}
					if(distance < mindistance)
						mindistance = distance;
				}
				
			}
			System.out.println(mindistance);
		}
		
	}
	

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值